跳转到内容

DarkBASIC 编程/文件控制与数据

来自维基教科书,开放的书籍,开放的世界

第 12 天

[编辑 | 编辑源代码]

第 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 天

[编辑 | 编辑源代码]

第 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 天会有很多数据。

第 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

它先保存数据,然后读取数据,你也可以反过来操作。无论你以哪种方式读取和保存数据,它都能正常工作。现在我们开始制作游戏了,不用解释(好吧,需要解释一些),纯粹的游戏编程。我们每天都会编写一个游戏,哇,我们开始吧!

华夏公益教科书