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