DarkBASIC 编程/文件控制与数据
第 12 天已经过去了,你正在朝着在 DarkBASIC 和一般编程中取得成功的职业道路前进!很多人都难以在 DarkBASIC 中写入文件,有些人还遇到了数据类型等问题。本课将花费很多时间讲解,我估计你需要 5 天的时间,我则需要大约 2 周的时间来撰写它们。希望我能赶在期限之前完成,但如果不行,你只能耐心等待我或其他贡献者的更新。今天,我们将学习如何保存文件。
举个例子,假设以下场景
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
真是太不可思议了!用机器语言实现同样的功能需要数千行代码,真是太疯狂了!正如你所发现的,上面的代码创建了一个字符串变量,将我们要操作的目录移动到 C 盘,如果文件存在则将其删除(否则无法覆盖它,因为它已经存在),然后写入文件,关闭它,打开它以读取内容,使用一个新的字符串来保存文本行,然后将其打印,最后你必须按任意键才能结束程序。太棒了!但是请记住扩展名?你可以更改它来创建你自己的文件。你也可以写入各种内容,例如:字节、字符等等。要查看更多可以写入的内容,请参阅 DarkBASIC 帮助文件中的命令参考。我们目前只使用字符串,稍后会使用字节。
此示例将生成语法错误,我现在就告诉你原因
a = 1 delete file "wrong.txt" open to write 1,"wrong.txt" write string 1,a
请记住,数字不是字符串,要将数字转换为字符串,我们可以执行以下操作
a = 1 a$ = str$(a) b = val(a$)
命令 str$ 将数字转换为值,命令 val 将字符串转换为值。你可以使用字符串执行许多其他奇怪的操作,你可以在 DarkBASIC 帮助文件中的字符串命令参考中找到这些操作。查看一些示例,并对其进行一些更改。
这是一个关于字符串的无用的小软件
`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
正如你所看到的,操作字符串很简单,但几乎没有用。在某些情况下,它们很有用,例如我们将很快制作的文件管理器工具,以及其他一些文件操作。在 2D 教程的最后一部分,我们将使用文件来制作一个非常简单的工具,非常类似于 ZZT 或 MegaZeux。还有很多内容需要讲解,请耐心等待!在第 13 天,我们将学习更多写入文件的方法,还记得字节吗?你可以使用它将值写入文件。我使用了 txt 作为扩展名,尝试使用 .dat、.ini 等扩展名。你甚至可以自己发明一个!使用 write,你还可以写入单词或整数、长整数或长整数,甚至浮点数。我不知道为什么要这样做。
写入文件的优秀示例
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
注意:来自 Cody Oebel
上面的代码无法正常工作,无法编译和运行。
我发现 If file exist("a") = 1 ... 中的 = 1 是模棱两可的,没有必要。
以下是我的代码段版本
`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
现在,你明白我的意思了吧?稍后,我们将使用当前目录和文件分支语句来制作一个简单的文件浏览器。非常简单!Write byte 有时用于瓦片贴图器等应用程序,但标准是 write string,因为它很简单。记住,简单才是最好的!
让我们写入一个数组
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
注意:上面的代码也不起作用:来自 Cody Oebel
这是我的工作版本,供其他读者查看一些小错误。
还要注意编译器底部显示的格式
用于保存数组和加载数组,例如文件名,数组。
我还添加了字符串变量 filename$ 来保存 "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
现在我们可以保存大型数组,数据库编程?还记得我们的猜谜游戏吗?回去修改一下,以便将新学的代码包含在其中。你已经了解了很多关于文件的知识。做好准备,在第 13 天学习目录!
第 13 天到了,我们离中点只差两天。这是个好消息,你越快成为 DarkBASIC 编程大师越好!好吧,实际上精通 DarkBASIC 需要一段时间,别担心,我并不是编程大师。如果你认识一些游戏制作水平很高的人,他们通常不是最好的程序员,而只是很棒的游戏制作人。一些 DarkBASIC 用户已经制作了商业游戏,例如:Dumbo & Cool、Star Wraith 等。DarkBASIC 非常适合制作游戏和团队合作。它不适合制作应用程序,你今天就会发现这一点。
这是一个简单的文件管理器
Input "Set directory to: ";direct$ set dir direct$
你没有看到文件,是吗?我们可以使用一些简单的命令轻松查看文件和任何东西。请记住,有些命令很繁琐,但如果与循环一起使用!现在,这是一个文件管理器,你可以更改目录、查看文件等等,它不是一个专业的工具,它只是教你如何使用它。但在我们开始之前,我们先看看一个更好的文件管理器。
`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
哇,这很酷,但没有用户输入,也没有文件操作,所以这个程序只是文件系统查看器。就像 Windows 资源管理器一样!实际上,现在编写文件管理器几乎没有用处,尤其是如果它很丑陋的话。但在 DarkBASIC 程序中使用文件管理器可以让效率更高,而不是在文件名或目录中键入内容等等。我们不会回到 DOS 时代,天哪,要键入命令并希望它能正常工作!还记得我说过繁琐吗?好吧,有一种更好的方法来编写上面的程序。别担心,我们稍后会编写一个文件管理器!在我展示更有效的方法之前。
请按照以下说明操作
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
好了,现在我们已经完成了,我们可以看到在文件系统查看器世界中更好的方法。我们距离文件管理器只差几个步骤了。
`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
看看我们节省了多少行代码?还有其他性能检查列表,例如目录和设备。去看看,将针对文件的性能检查命令替换成其中一些命令。
现在,请记住你下载的文件管理器库,如果你还没有猜到,我们将修改包含文件(不是函数库)中的部分代码,来制作我们自己的修改版文件管理器。请记住,该库是 TDK_MAN 的版权,他是 DarkBASIC 最出色的程序员之一,除了你(我是在拍马屁),我相信你经过 30 年的努力可以超越他。我只是在开玩笑,如果你在阅读本文,TDK,别介意。他制作了很多 DarkBASIC 程序,包括 MatEdit,我们将在后面的 3D 章节中使用它,以及一个 3D 建模器等等。
以下是源代码
`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
有了它,你就可以轻松地使用文件管理器,这要感谢其他人的函数库!你可以在 TDK 的网站 (http://www.matedit.com/db.htm) 上找到很多类似的库。还有关于函数和更多内容的教程。第 13 天就讲到这里,我们有一段时间没有进行测验了,所以以后会有很多测验。我找不到值得测试你的内容。第 14 天会有很多数据。
我们已经知道什么是变量了,但你还没有使用数据语句。数据语句非常容易使用,你只需输入数据,空格,然后输入所有类型的数据。
数据示例
data "strings",12,5.6,"and integers and floats tooooooooooooooooo!!!!!!!" data 12 data "string me" data 5.50
你可以在一条语句中包含多种数据类型,只要用逗号隔开它们即可。这很有用,但我们如何读取数据?我们可以使用 read。
`Read Example data 4 read var1 Print var1
你可以使用 restore 重置数据指针,你稍后会明白我的意思。使用不同的标签来保存不同的数据是一种好习惯。
`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
它先保存数据,然后读取数据,你也可以反过来操作。无论你以哪种方式读取和保存数据,它都能正常工作。现在我们开始制作游戏了,不用解释(好吧,需要解释一些),纯粹的游戏编程。我们每天都会编写一个游戏,哇,我们开始吧!