500 likes | 626 Views
檔案與資料存取. C:. C:test.tmp. Open "C:test.tmp" For Output As #1 Str1 = “ 中華民國萬歲 " Val1 = 7654321 Write #1, Str1, Val1 Str1 = “ 三民主義萬歲 " Val1 = 1234567 Write #1, Str1, Val1 Close #1. 【 實例:輸出到表單 】 Private Sub cmdrun_Click() Print , " 九九乘法表 " For I = 1 To 7 Step 3 For j = 1 To 9
E N D
C: C:\test.tmp Open "C:\test.tmp" For Output As #1 Str1 = “中華民國萬歲" Val1 = 7654321 Write #1, Str1, Val1 Str1 = “三民主義萬歲" Val1 = 1234567 Write #1, Str1, Val1 Close #1
【實例:輸出到表單】 Private Sub cmdrun_Click() Print , "九九乘法表" For I = 1 To 7 Step 3 For j = 1 To 9 For k = 0 To 2 Print I + k; "*"; j; "="; If (I + k) * j < 10 Then Print " "; Print (I + k) * j, Next k Print Next j Print Next I End Sub
【實例:輸出到檔案】 Private Sub cmdrun_Click() Open “9x9.txt” for output as 1 Print #1, , "九九乘法表" For I = 1 To 7 Step 3 For j = 1 To 9 For k = 0 To 2 Print #1, I + k; "*"; j; "="; If (I + k) * j < 10 Then Print #1, " "; Print #1, (I + k) * j, Next k Print #1, Next j Print #1, Next I End Sub
開啟檔案之語法 Open 檔名 For 存取模式 [Access 存取屬性][鎖護] As [#] n [Len=記錄長度] 檔名: 磁碟代號+目錄+檔名-->完整路徑 存取模式: 循序存取(Sequential Access) 二元存取(Binary Access) 隨機存取(Random Access) #n: 緩衝區或資料暫存區代號
關於檔名 完整路徑表示:(磁碟代號+目錄)+檔名+副檔名 “C:\Program Files\VB6\samples\data1.dat” “A:\SPP\LKK\5630.txt” 若檔名之前未加上完整路徑則 “data1.dat” “5630.txt” VB會將之設定為目前之工作目錄, 亦即VB系統所在之目錄,例如 “C:\Program Files\Microsoft Visual Studio\VB98\ data1.dat”
檔名指定 1.直接指定 Open “A:\SPP\LKK\5630.txt” for Input As #1 2.變數指定 Filename1=“C:\VB6\samples\data1.dat” Filename2=Text1.Text Filename3=Combo1.Text Open Filename1 for Output As #1 Open Filename2 for Output As #2 Open Filename3 for Output As #3 3.利用檔案管理相關物件 DriveListBox, DirListBox, FileListBox, 通用對話框
與路徑設定有關之控制項 FileListBox 縮寫File DriveListBox 縮寫Drive DirListBox 縮寫Dir
Dir1 File1 Drive1 檔名有關物件之 一般設計 決定選擇的檔案 顯示該目錄之檔名 顯示在Text1框 Text1 則顯示目錄改變 若改變 Combo1 若改變則顯示檔案型式改變
利用Common Dialog Control可快速獲得 • 存取檔案視窗 • Action=1 • 開啟檔案視窗 • Action=2 • 儲存檔案視窗 • Action=3 • 選取色彩視窗
Open 檔名 For 存取模式 As #緩衝區代號... 關於緩衝區編號 緩衝區是主記憶體開闢的一塊記憶體,作 為使用者存取磁碟資料的資料暫存區,當 資料存放達到緩衝區的大小或宣告關閉 緩衝區時(Close),電腦才一口氣將緩衝 區之資料存入磁碟之中。 緩衝區代號最多達512個 每一個緩衝區之長度預設為512 bytes
#512 #511 #510 #509 #2 #1 緩衝區 磁碟機 資 料 資 料 資 料 資 料 資 料 檔案 2 檔案 1 SLOW FAST
Open 檔名 For 存取模式 As #緩衝區代號... 存取模式: 循序存取(Sequential Access) 二元存取(Binary Access) 隨機存取(Random Access)
寫入 變數 資料 資料 讀取 變數 循序存取(Sequential Access) 存檔 Open filename For Output As #1 讀檔 Open filename For Input As #1
資料1 資料2 filename 存檔語法 Open filename For Output As #1 Print #1, 資料1 Print #1, 資料2 Close #1 WordPad
存檔語法 Open filename For Output As #1 Print #1, 資料1,資料2 Close #1 資料1 資料2 filename
Dim Str1 As String, Val1 As Long Open "C:\test.tmp" For Output As #1 Str1 = “中華民國萬歲" Val1 = 7654321 Print #1, Str1, Val1 Str1 = “三民主義萬歲" Val1 = 1234567 Print #1, Str1, Val1 Close #1 中華民國萬歲 7654321 三民主義萬歲 1234567 空14格 filename
存檔語法 Open filename For Output As #1 Write #1, 資料1 Write #1, 資料2 Close #1 資料1 資料2 filename
存檔語法 Open filename For Output As #1 Write #1, 資料1,資料2 Close #1 資料1,資料2 filename
Write #1,資料1,資料2 filename 資料1,資料2 資料1 資料2 變數1 變數2 讀檔語法 Open filename For Input As #1 Input #1, 變數1,變數2 Close #1
Dim Str1 As String, Val1 As Long Open "C:\test.tmp" For Output As #1 Str1 = “中華民國萬歲" Val1 = 7654321 Write #1, Str1, Val1 Str1 = “三民主義萬歲" Val1 = 1234567 Write #1, Str1, Val1 Close #1 “中華民國萬歲”,7654321 “三民主義萬歲”,1234567 以逗號分隔 filename
Private Sub Command1_Click() Dim Str1 As String, Val1 As Long Dim Tmp1, Tmp2 Open "C:\test.tmp" For Output As #1 Str1 = “中華民國萬歲" Val1 = 7654321 Write #1, Str1, Val1 Str1 = “三民主義萬歲" Val1 = 1234567 Write #1, Str1, Val1 Close #1 Open "C:\test.tmp" For Input As #1 Input #1, Tmp1, Tmp2 '讀取第一筆 Msgbox Tmp1 & ":" & Tmp2 Input #1, Tmp1, Tmp2 '讀取第二筆 Msgbox Tmp1 & ":" & Tmp2 Close #1 End Sub
Print與Write存檔之差異 Print 將存入之資料視為文字檔 Write保留變數之型態 (故Print方式存檔較適合儲存文字檔,Write則較適用資料檔)
循序檔資料讀取 循序檔-讀取資料 在Visual Basic中,讀取循序檔的資料則可以透過『Input #』敘述、『Line Input #』敘述及『Input』函數來完成。 『lnput #』敘述(讀取資料) 【語法說明】: 變數1、變數2、、可以為數值、字串或陣列變數。 變數的資料型態最好與檔案的資料型態相符,並且檔案的數值資料可以讀入字串變數,但檔案的字串資料不可以讀入數值變數中。 循序檔中若同時包含有文字與數值資料,在存檔時,最好不要使用『Print #』敘述存檔,否則使用『Input #』敘述來讀取資料時,可能會發生錯誤。 語法:Input #檔案代碼,變數1[,變數2]… 功能:從檔案代碼對應的循序資料檔中依序讀出資料並存放到指定的變數中 25
循序檔資料讀取 『Line Input #』敘述(讀取整列資料) 【語法說明】: 1. 字串變數:存放檔案整列的資料。由於一次讀一列資料,因此不論資料是數值還是字元,都會被當成是字串的一部份,因此不可使用數值變數來存放讀取到的整列資料。 2. 『Line Input #』敘述將讀取整列的資料,直到碰上換列字元為止。不論該列資料中出現任何的字元都被當成一個普通的字元而已,即使是逗號字元與空白字元也是不具任何特殊意義的。 語法:Line Input #檔案代碼,字串變數 功能:從檔案代碼對應的循序資料檔中一次讀取一列資料並存放到指定的變數中 26
使用Line Input讀取一整行資料 Private Sub Command1_Click() Dim Str1 As String, Tmp1 As String Open "C:\test.tmp" For Output As #1 Str1 = “中華民國 萬萬歲" Print #1, Str1 Str1 = “三民主義 萬萬歲" Print #1, Str1 Close #1 Open "C:\test.tmp" For Input As #1 Line Input #1, Tmp1 ‘讀取第一行 Msgbox Tmp1 Line Input #1, Tmp1 ‘讀取第二行 Msgbox Tmp1 Close #1 End Sub
Append存檔模式 Open filename For Append As #1 把資料添增到檔案裡 Private Sub Command1_Click() Dim Str1 As String Open "C:\test.tmp" For Append As #1 Str1 = “消滅萬惡共匪” Write #1, Str1 Str1 = “解救大陸同胞” Print #1, Str1 Close #1 End Sub C:\test.tmp “中華民國萬歲” “三民主義萬歲” “消滅萬惡共匪” “解救大陸同胞”
範例:製作一個程式使用記錄檔 Private Sub Form_Load() Dim MyFile As String, UserName As String UserName = InputBox("請輸入你的名字", ,"客人") MyFile=“c:\record.txt” Open MyFile For Append As #1 Write #1, Date$, Time$, UserName '你的程式一啟動就會把 日期、時間與使用人的資料加入檔案 Close #1 End Sub
Private Sub Command1_Click() Dim MyFile As String, A$, B$, C$ List1.Clear ‘清除列示方塊內容 MyFile=“c:\record.txt” Open MyFile For Input As #1 Do Input #1, A$, B$, C$ List1.AddItem “日期:” & A$ & “,時間:” & _ B$ & ",使用者:" & C$ Loop Until EOF(1) Close #1 End Sub
What is a Binary file ? 顯示字元 A 1 ß ASCII 65 49 225 Hex 41 31 E1 Binary 01000001 00110001 11100001 All files are stored as binary form in devices. When we say binary file, we mean non-sequential files (text) or random file (records)!
循序檔內之資料以文字型態儲存,以1byte為存取單位,因此只要以文字編輯器開啟之,便可了解其儲存格式,修改及處理容易,但其缺點為:循序檔內之資料以文字型態儲存,以1byte為存取單位,因此只要以文字編輯器開啟之,便可了解其儲存格式,修改及處理容易,但其缺點為: • 資料保密性差 • 較佔儲存空間(對數值型資料而言) • 無法直接針對某一筆資料進行存取 • 以Binary方式存取可滿足上述之缺失
在循序檔中,資料均視為文字檔,每一個文字佔1位元組(Byte)之空間在循序檔中,資料均視為文字檔,每一個文字佔1位元組(Byte)之空間 “A”,”A”,”A”,”A”,…. Open “C:\test.txt” _ for output as #1 Dim I For I = 1 to 1024 Write #1, “A”, Write #1, 1, Next I Close #1 共需1024 x 4 bytes = 4096 bytes = 4 Kb 1,1,1,1,1,1,…... 共需1024 x 2 bytes = 2048 bytes = 2 Kb
二進位檔可大量節省數值型之儲存空間 “A”,”A”,”A”,”A”,…. Open “C:\test.txt” _ for output as #1 For I = 1 to 1024 Write #1, “A”, Write #1, 10000, Next I Close #1 共需1024 x 4 bytes = 4096 bytes = 4 Kb 10000,10000,… 共需1024* 6 bytes = 6Kb
二進位檔可大量節省數值型之儲存空間 AAAA….. Dim I as integer For I = 1 to 1024 put #1, ,“A”, put #2, ,10000, Next I 共需1024 x 1 bytes = 1024 bytes = 1 Kb 亂碼 共需1024 x 2 bytes = 2048 bytes = 2 Kb
Open 檔名 For Binary As #緩衝區編號 以 Put 存檔 <例> Put #1,2,str ‘代表將變數str存在第二個byte 並將指標移往該筆記錄 Put #1,,str ‘直接將變數str存到目前指標所 指之位置 以 Get 讀檔 <例> Get #1,3,str ‘代表將第三個byte讀出存至變 數str,並將指標移往該byte Get #1,,str ‘將目前指標所指之第一byte讀 出並存至變數str
Dim Sars As Single Get #1,1,Sars Dim Sars As Integer Get #1,1,Sars Dim Sars As Long Get #1,1,Sars Dim Sars As String*3 Get #1,1,Sars 循序檔每次讀 1 byte, 僅能依序讀取,無法直接讀取特定的byte = 1 byte I L I K E 睡 ½ ¤ 覺 二進位檔每次讀取之byte數依變數型別而異, 且可任意讀取特定位置,以指標值所指byte數控制
記錄(Record) 為何需要記錄(Record)? 在上一個範例中,我們可以從檔案中讀取3筆資料,由於每次的資料都存放在stu_id, ScoreComputer, ScoreMath, ScoreEng等變數中,因此無法一次儲存所有的資料 43
記錄(Record) 為了解決無法一起存放的問題,我們可以使用二維陣列來存放每一次讀取的資料,只需要使用簡單的迴圈即可完成,但是請注意當資料型態不一致時(例如:stu_id為字串,ScoreComputer為數值),我們必須要將陣列的資料型態宣告為Variant 。 44
記錄(Record) 移動順序時若橫向列可以一併移動,才能解決這個問題,Visual Basic和其他的高階語言一樣,也提供了記錄(Record)資料型態。 如果我們想用之前學習的排序程式針對『計概』分數做排序,則陣列經由排序後會變成上圖之狀況 45
記錄(Record) 「記錄」是由一些邏輯相關的「欄位」(Field)所構成。例如:一位學生的學號、計概成績、數學成績、英文成績就是一筆記錄,該記錄則擁有「學號」欄、「計概」欄、「數學」欄、「英文」欄,而一群學生的記錄集合將構成記錄陣列。 46
記錄(Record) 一個記錄資料型態包含許多「欄位」,每一個欄位都必須賦予一個欄位名稱。由於記錄是使用者自訂的資料型態,因此記錄在使用之前必須要先經過定義,然後在經過宣告後才可使用。 定義記錄型態的語法如下: 宣告記錄變數的語法如下: 語法:[Private|Public] Type記錄型態名稱 欄位名稱[(索引)] As資料型態 [欄位名稱[(索引)] As資料型態] End Type 功能:定義一個記錄型態包含哪些欄位以及各欄位的資料型態 。 語法:Dim 記錄變數名稱 As 記錄型態名稱 功能:宣告記錄變數為已定義的記錄資料型態 47
記錄(Record) 【範例】:利用記錄型態來宣告一個成績的記錄。 一個記錄包括四個欄位如下: 學生學號:固定字串(8個字元) 計概成績:整數 數學成績:整數 英文成績:整數其記錄型態定義格式如右:上述定義代表有一個名稱為Score_Record記錄型態,當中包含有四個欄位,分別為固定字串變數stu_id、整數變數S_Computer、整數變數S_Math及、整數變數S_Eng。若要宣告含有五個記錄變數的記錄陣列Score,則可如下宣告: 48
13.4:記錄(Record) 經過上述宣告後,將會在主記憶體配置五個記錄變數,每個記錄變數都含有四個欄位,分別為Score(i).stu_id、Score(i).S_Computer、Score(i).S_Math、Score(i).S_Eng,且1≦i≦5。該記錄陣列在主記憶體中的配置如下圖示意:
隨機檔 開檔隨機檔 【語法說明】: 1. 使用Open敘述開啟隨機檔,可以透過Len參數指定記錄長度(單位為Byte),若省略Len參數,則預設值為128 bytes。 2. 當開啟檔案後,若不知道記錄長度時,可以使用Len函數取得記錄大小。例如:Length = Len (Score_Record) 3. 隨機檔開啟後,可讀取也可寫入。不必像循序檔分為『Open…For Input』敘述和『Open…For Output』。 語法:Open "檔名" For Random As #檔案代碼[Len = 記錄長度] 功能:以隨機模式開啟檔案。 50
隨機檔 存取隨機檔 隨機檔的每一筆記錄都有一個不同的記錄編號。要搜尋某一筆記錄時,必須在程式中輸入該筆記錄的編號,由於隨機檔每筆資料長度均相同,系統可以很快依公式算出該記錄編號的實際位置,然後將該筆記錄取出。因此隨機檔的資料是可以隨意存取(不必按照順序),平均存取速度比循序檔快許多,適合用時常更動內容的檔案。 Put敘述 Get敘述 語法:Put[#]檔案代碼,[記錄編號],變數 功能:寫入一筆資料到隨機檔中 語法:Get[#]檔案代碼,[記錄編號],變數 功能:從隨機檔中讀取一筆資料 52
如上例, 直接讀取Bank變數 A=1 byte B=2 bytes C=8 bytes Bank = 4 bytes Dim A As Byte Dim B As Integer Dim C As Double Dim Bank As Single A B C D Get #1,12,Bank
Dim A As Byte Dim B As Integer Dim C As Double Dim Bank As Single A=1 byte B=2 bytes C=8 bytes Bank = 4 bytes A B C D 想像若要連續讀取Bank變數,則讀取第1筆為 Get #1,12,Bank 想像若要連續讀取Bank變數,則讀取第2筆為 Get #1,27,Bank
Random 模式 Open 檔名 For Random As 緩衝區編號 Len = 結構變數長度 Type Money Dim A As Byte Dim B As Integer Dim C As Double Dim Bank As Single End Type Dim Deposit as Money • Open “c:\test.bin" For Random As #1 Len =Len(Deposit) 以Random 模式讀取第1筆資料: Get #1,1,Deposit 以Random 模式讀取第2筆資料: Get #1,2,Deposit