DarkBASIC Programming/File Control & Data

Day 12

edit

Day 12 already, you're progressing towards a great career in programming DarkBASIC and programming in general! Lots of people have trouble writing files in DarkBASIC, and some have problems with Data types and more. This lesson will take a lot of time to cover, I'm going to say 5 days for you and about 2 weeks for me to write them. Hopefully, I'll get them done before but if not well you just have to wait for me or another to contribute. Today, we'll learn how to save a file.

Take for example this scenario

text$ = "Hey guess what open me up in notepad and see what happens!"
set dir "C:/"
if file exist("openmeupfast.txt") = 1  
   delete file "openmeupfast.txt"
endif
open to write 1,"openmeupfast.txt"
write string 1,text$
close file 1
open to read 1,"openmeupfast.txt"
read string 1,newtext$
Print newtext$
close file 1
wait key
end

What a mouth full! In machine language it takes several thousand lines to do this same exact thing crazy or what! As you found out, the code above creates a string variable, moves the directory we'll be working in to c drive, if the file exist deletes it(or else we cannot overwrite it as it already exists), writes the file, closes it, opens it to read the contents, uses a new string to contain the line of text, then Prints it and finally you have to press any key before it ends. Now that's great! But remember the extension? You can change it to create your own files. You can also write various things such as: bytes, characters, and so on. To see more of what you can write view the command reference under the DarkBASIC help file. We'll just be using string for now and later byte.

This example will generate a syntax error and I'll tell you why now

a = 1
delete file "wrong.txt"
open to write 1,"wrong.txt"
write string 1,a

Remember numbers are not strings, to make a number a string we can do the following:

a = 1
a$ = str$(a)
b = val(a$)

The command str$ changes a number into a value, and the command val changes a string into a value. There are many other odd things you can do with strings as well which you can see under the DarkBASIC help file command reference of strings. See some examples and change them around a bit.

Here's a useless kinda piece of software for strings

`Crazy Strings
`By Dbtutor

cls
message$ = "Hello World!"
Print "ASC() returns the ASCII number of the first letter in the str"
Print asc(message$)
Print "Len counts how many characters in a string"
Print len(message$)
Print "Mid gets the middle write characters of a string"
midval = 3
Print mid$(message$,midval)
Print "Here's the binary of the number 678"
Print bin$(678)
Print "Here's the hex of that number"
Print hex$(678)
Print "There are many more ways of destroying strings"
Print "Much are useless, but take a gander at them"
wait key
end

As you saw above manuiplating strings is easy but pretty much useless. In some situations they are useful like a file manager tool which we'll be making very soon along with some other file stuff. In the 2d tutorial's final part we'll use files to make a very simple tool very much like ZZT or MegaZeux. There's lots to cover so bear with me! On day 13 we'll be learning more ways of writing files, remember byte? Well you can use it to write a value to a file. I used txt has my extension, try using .dat, .ini, etc. You can even make one up! Using write, you can also write word or an integer value, a long or long integer value, and even a float. Why I don't know.

Good Example of Writing A File:

a = 1
b$ = str$(a)
if file exist("a") = 1 then delete file "a"
open to write "a",1
write string 1,b$
close file 1
if file exist("a") = 1 then readit = 1
if readit = 1
   open to read 1,"a"
   read string 1,c$
   d = val(c$)
   Print d
   Print "Same thing! Use val and str! Their better!"
   wait key
   end
endif

Note: from Cody Oebel

the above code fails to work properly, and will not compile and run.

I found the If file exist("a") = 1 ... the = 1 is ambiguous, and is not needed.

below is my version of this code snippet

`Edit by Cody C Oebel:
 
 g = 11
 set dir "c:/"
 b$ = str$(g)
 if file exist("a.txt") then delete file "a.txt"
 open to write 1, "a.txt"
 write string 1, b$
 close file 1
 if file exist ("a.txt")
 open to read 1, "a.txt"
 read string 1, z$
 d = val(z$)
 print d
 print "This should work now, and is smaller amount of code"
 wait key
 endif
 end

Now, see what I mean? Later we'll be using current directories and file branching statements to make a simple file browser. Very simple! Write byte is sometimes used for example in tilemappers and so on but the standard is write string because it's simple. Remember keep it simple stupid!

Let's write an array

dim a$(10)
a$(1) = "jsdakjlakljldsaf"
a$(2) = "ashjajasjhsjks"

save array a$(10),"array.ini"

load array a$(10),"array.ini"

for a = 1 to 10
  Print a$(a)
next a

wait key
end

NOTE: Again this code above did not work: By Cody Oebel

Here is my working version for other readers to see the minor mistakes.

Also note at the bottom of the compiler it shows you the format

for save array, and load array e.g. Filename, array.

I also added the variable stringname filename$ to contain "array.ini"

dim a$(10)
filename$ = "array.ini"
a$(1) = "jsdakjlakljldsaf"
a$(2) = "ashjajasjhsjks"
set dir "c:/"
save array filename$, a$(10)

load array filename$, a$(10)

for a = 1 to 10
  Print a$(a)
next a

wait key
end

Now we can save big ole arrays, database programming anyone? Remember our guessing game? Go back and fix it up a bit so that you can include this newly learned code in it. You've learned a lot about files so far. Perpare for directories on Day 13!

Day 13

edit

Day 13 arrived and we're only two days away from the half way point. That's great news, as soon as you can be a master programmer in DarkBASIC the better! Well, really DarkBASIC takes awhile to master, not to scare you but I'm not a master programmer either. If you know somebody with a good game it's usually not that they're the best programmer but just a great game maker. Some DarkBASIC users have gone on to make commercial games such as: Dumbo & Cool, Star Wraith, etc. DarkBASIC is great for games and team efforts. Not so for applications as you'll find out today.

Here's a simple file manager

Input "Set directory to: ";direct$
set dir direct$

You don't get to see files do you? We can easily view files and whatever using some simple commands. Remember some are tedious, but when in use with loops! Now this is a file manager, you change dirs, view files, and whatnot, it's not a professional tool, it's showing you the ropes. But before we do it's time to have a look at a better file manager.

`Simple File Manager
`By Dbtutor

`Get the directory to use
setdirect$ = get dir$()

`Set the directory to the current directory
set dir setdirect$

`Current amount of items
items = 10

find first
Print get file name$(1)

for a = 2 to items
  find next
  Print get file name$(a)
next a

Wait key
end

Wow, that's cool and all but there's no user input and no file manipulation dus this program is file system viewer. Just like windows explorer! Really nowadays writing a file manager is pretty much useless especially if it's ugly. But file managers in your program in DarkBASIC allows better productivity then in typing in the file name or directory and whatnot. We're not going back to the DOS days God forbid type in a command and hope it works! Remember I said tedious? Well there is a much better way to write the following program above. Don't worry we'll be writing a file manager later! Before I show you a more productive way.

Follow these instructions:

Go to http://www.computechtenerife.com/
Register as a user.
Click on Dark Basic Support and then Downloads
Scroll down and find the function libraries
Click on the Db file selector
Download and extract the files for usage later

Okay now that's done we can see a better way of doing things in the file system viewer world. We're only a few blocks away from the file manager.

`Simple File Viewer
`By Dbtutor

set dir "C:\"

Perform checklist for files
for a = 1 to checklist quantity()
  Print checklist string$(a)
next a

Wait key
end

See how many lines less we have? There is other perform checklist for things such as directories and devices. Go have a look and change perform checklist for files command with a few of them.


Now remember that file manager library you downloaded, if you haven't guessed we'll be modding some of the code inside the include file(not the function library) to make our own modded file manager. Remember the library is copyright to a DarkBASIC user known as TDK_MAN one of the best DarkBASIC programmers out there besides you(just flattering) I'm sure you could beat him at his game after 30 years. Just kidding if your reading this TDK no offense. He's made lots of DarkBASIC programs including MatEdit which we'll be using later on in the 3d chapters along with a 3d moddler and whatnot.

Here's the Source Code

`Thanks TDK For the Library Off your Site!
Rem Fileselector Function Demo - Copyright TDK_Man May 2003
Rem Modded Version By Dbtutor
gosub filemanager
filemanager:
#Include "FileSelect.dba"

Set Display Mode 800,600,16
Cls
Sync On

Rem Required DIM Statements At The Beginning Of Your Program
Dim Files$(1000,2): Dim Drv$(26): Dim Temp$(1000,2): Dim GotDrives(1)
Dim Path$(1): Dim Filename$(1): Dim SliderHeight(1): Dim FileOffset(1)

Title$="Load File": Rem Text to appear at top of fileselector
Filter$="*.*": Rem 3 char filter extension (Eg: 'TXT') or *.* for all files
CurDir$="C:\Program Files\Dark Basic Software": Rem Starting Directory

Rem Function Call
Selected=Fileselect(CurDir$,Title$,Filter$)
Rem On return Selected=1 if OK clicked and 0 if Cancel clicked

CLS
If Selected=1: Rem OK Was Clicked
  Print "Selected Filename: ";Filename$(0)
  Print "Selected Path: ";Path$(0)
  `Modded Code here
  Print "Press Any Key to Manage File"
  wait key
  myfile$ = filename$(0)
  mydir$ = path$(0)
  gosub managefile
Else: Rem Cancel Was Clicked
  Print "Cancel Button Chosen"
Endif

`All Original Code Below
`By Dbtutor
managefile:
set dir mydir$
getext$ = left$(myfile$,4)
if getext$ = ".bmp" or ".jpg" then gosub view_bmp
if getext$ = ".mid" or ".wav" then gosub view_audio

view_bmp:
Load image myfile$,1
paste image 1,1,1
set cursor 1,400
wait key
cls
gosub filemanager

view_audio:
load music myfile$,1
play music 1
wait key
cls
gosub filemanager

There you are a easy file manager thanks to other peoples function libraries! You can find lots on TDK's site(http://www.matedit.com/db.htm). Along with tutorials for functions and more. That's all for Day 13, there was no quiz for awhile so expect a lot of quizzes later on. I couldn't find anything worth quizzing you on. There will be lotsa data going on in Day 14.

Day 14

edit

We already know what variables are, but you haven't used data statements yet. Data statements work very easily, you just put data, space and then put all the types of data.

Examples of Data

data "strings",12,5.6,"and integers and floats tooooooooooooooooo!!!!!!!"
data 12
data "string me"
data 5.50

You can have lots of data types in one statement as long as you separate them with commas. That's useful but how can we read the data? Well we can use read.

`Read Example
data 4
read var1
Print var1

You can use restore to reset the data pointer you'll see what I'm talking about later. It's good practice to use different labels to store different data.

`Big Data Example
gosub datastored

datastored:
data 1234
data 12
data 1
data 4
data 56 
gosub readdata

readdata:
read var1
read var2
read var3
read var4
read var5

print var1
Print var2
Print var3
print var4
Print var5

First it stores data then reads it, you can do this backwards if you want. Whichever way you read and store data it works. Now we're into games, no explaining(well some) just pure games programming. We'll program a game a day woohoo let's go now!