跳轉到內容

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

它先儲存資料,然後讀取資料,你也可以反過來操作。無論你以哪種方式讀取和儲存資料,它都能正常工作。現在我們開始製作遊戲了,不用解釋(好吧,需要解釋一些),純粹的遊戲程式設計。我們每天都會編寫一個遊戲,哇,我們開始吧!

華夏公益教科書