Download presentation
Presentation is loading. Please wait.
1
檔案與資料存取
2
Open "C:\test.tmp" For Output As #1
Str1 = “中華民國萬歲" Val1 = Write #1, Str1, Val1 Str1 = “三民主義萬歲" Val1 = Close #1 C: C:\test.tmp
3
Private Sub cmdrun_Click() Print , "九九乘法表" For I = 1 To 7 Step 3
【實例:輸出到表單】 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 Next I End Sub
4
Private Sub cmdrun_Click() Open “9x9.txt” for output as 1
【實例:輸出到檔案】 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 Next I End Sub
5
Open 檔名 For 存取模式 [Access 存取屬性][鎖護] As [#] n [Len=記錄長度]
開啟檔案之語法 Open 檔名 For 存取模式 [Access 存取屬性][鎖護] As [#] n [Len=記錄長度] 檔名: 磁碟代號+目錄+檔名-->完整路徑 存取模式: 循序存取(Sequential Access) 二元存取(Binary Access) 隨機存取(Random Access) #n: 緩衝區或資料暫存區代號
6
關於檔名 完整路徑表示:(磁碟代號+目錄)+檔名+副檔名 若檔名之前未加上完整路徑則
“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”
7
檔名指定 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, 通用對話框
8
與路徑設定有關之控制項 FileListBox 縮寫File DriveListBox 縮寫Drive DirListBox 縮寫Dir
9
檔名有關物件之 一般設計 Dir1 File1 Text1 Combo1 若改變 Drive1 若改變則顯示檔案型式改變 顯示該目錄之檔名
決定選擇的檔案 顯示該目錄之檔名 顯示在Text1框 Drive1 Dir1 File1 Text1 則顯示目錄改變 若改變 Combo1 若改變則顯示檔案型式改變
10
利用Common Dialog Control可快速獲得
存取檔案視窗 Action=1 開啟檔案視窗 Action=2 儲存檔案視窗 Action=3 選取色彩視窗
11
Open 檔名 For 存取模式 As #緩衝區代號...
關於緩衝區編號 緩衝區是主記憶體開闢的一塊記憶體,作 為使用者存取磁碟資料的資料暫存區,當 資料存放達到緩衝區的大小或宣告關閉 緩衝區時(Close) ,電腦才一口氣將緩衝 區之資料存入磁碟之中。 緩衝區代號最多達512個 每一個緩衝區之長度預設為512 bytes
12
資 料 資 料 資 料 資 料 資 料 緩衝區 磁碟機 #512 #511 #510 #509 #2 #1 SLOW FAST 檔案 2
檔案 1 SLOW FAST
13
FreeFile函數
14
Open 檔名 For 存取模式 As #緩衝區代號...
存取模式: 循序存取(Sequential Access) 二元存取(Binary Access) 隨機存取(Random Access)
15
循序存取(Sequential Access)
存檔 Open filename For Output As #1 變數 寫入 資料 讀檔 Open filename For Input As #1 資料 變數 讀取
16
Open filename For Output As #1 Print #1, 資料1 Print #1, 資料2 Close #1
存檔語法 Open filename For Output As #1 Print #1, 資料1 Print #1, 資料2 Close #1 WordPad filename 資料1 資料2
17
Open filename For Output As #1 Print #1, 資料1,資料2 Close #1
存檔語法 Open filename For Output As #1 Print #1, 資料1,資料2 Close #1 資料1 資料2 filename
18
filename Dim Str1 As String, Val1 As Long
Open "C:\test.tmp" For Output As #1 Str1 = “中華民國萬歲" Val1 = Print #1, Str1, Val1 Str1 = “三民主義萬歲" Val1 = Close #1 中華民國萬歲 三民主義萬歲 空14格 filename
19
Open filename For Output As #1 Write #1, 資料1 Write #1, 資料2 Close #1
存檔語法 Open filename For Output As #1 Write #1, 資料1 Write #1, 資料2 Close #1 資料1 資料2 filename
20
Open filename For Output As #1 Write #1, 資料1,資料2 Close #1
存檔語法 Open filename For Output As #1 Write #1, 資料1,資料2 Close #1 資料1,資料2 filename
21
讀檔語法 filename Open filename For Input As #1 Input #1, 變數1,變數2 Close #1
Write #1,資料1,資料2 filename 資料1,資料2 資料1 資料2 變數1 變數2 讀檔語法 Open filename For Input As #1 Input #1, 變數1,變數2 Close #1
22
filename Dim Str1 As String, Val1 As Long
Open "C:\test.tmp" For Output As #1 Str1 = “中華民國萬歲" Val1 = Write #1, Str1, Val1 Str1 = “三民主義萬歲" Val1 = Close #1 “中華民國萬歲”, “三民主義萬歲”, 以逗號分隔 filename
23
Private Sub Command1_Click()
Dim Str1 As String, Val1 As Long Dim Tmp1, Tmp2 Open "C:\test.tmp" For Output As #1 Str1 = “中華民國萬歲" Val1 = Write #1, Str1, Val1 Str1 = “三民主義萬歲" Val1 = Close #1 Open "C:\test.tmp" For Input As #1 Input #1, Tmp1, Tmp '讀取第一筆 Msgbox Tmp1 & ":" & Tmp2 Input #1, Tmp1, Tmp '讀取第二筆 End Sub
24
Print與Write存檔之差異 Print 將存入之資料視為文字檔 Write保留變數之型態
25
循序檔資料讀取 循序檔-讀取資料 『lnput #』敘述(讀取資料)
在Visual Basic中,讀取循序檔的資料則可以透過『Input #』敘述、『Line Input #』敘述及『Input』函數來完成。 『lnput #』敘述(讀取資料) 【語法說明】: 變數1、變數2、、可以為數值、字串或陣列變數。 變數的資料型態最好與檔案的資料型態相符,並且檔案的數值資料可以讀入字串變數,但檔案的字串資料不可以讀入數值變數中。 循序檔中若同時包含有文字與數值資料,在存檔時,最好不要使用『Print #』敘述存檔,否則使用『Input #』敘述來讀取資料時,可能會發生錯誤。 語法:Input #檔案代碼,變數1[,變數2]… 功能:從檔案代碼對應的循序資料檔中依序讀出資料並存放到指定的變數中 25
26
循序檔資料讀取 『Line Input #』敘述(讀取整列資料) 語法:Line Input #檔案代碼,字串變數
【語法說明】: 1. 字串變數:存放檔案整列的資料。由於一次讀一列資料,因此不論資料是數值還是字元,都會被當成是字串的一部份,因此不可使用數值變數來存放讀取到的整列資料。 2. 『Line Input #』敘述將讀取整列的資料,直到碰上換列字元為止。不論該列資料中出現任何的字元都被當成一個普通的字元而已,即使是逗號字元與空白字元也是不具任何特殊意義的。 語法:Line Input #檔案代碼,字串變數 功能:從檔案代碼對應的循序資料檔中一次讀取一列資料並存放到指定的變數中 26
27
使用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 = “三民主義 萬萬歲" Close #1 Open "C:\test.tmp" For Input As #1 Line Input #1, Tmp ‘讀取第一行 Msgbox Tmp1 Line Input #1, Tmp ‘讀取第二行 End Sub
28
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 “中華民國萬歲” “三民主義萬歲” “消滅萬惡共匪” “解救大陸同胞”
29
MyFile=“c:\record.txt”
範例:製作一個程式使用記錄檔 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
30
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
32
What is a Binary file ? 顯示字元 A 1 ß ASCII 65 49 225 Hex 41 31 E1
All files are stored as binary form in devices. When we say binary file, we mean non-sequential files (text) or random file (records)!
33
循序檔內之資料以文字型態儲存,以1 byte為存取單位,因此只要以文字編輯器開啟之,便可了解其儲存格式,修改及處理容易,但其缺點為:
資料保密性差 較佔儲存空間(對數值型資料而言) 無法直接針對某一筆資料進行存取 以Binary方式存取可滿足上述之缺失
34
在循序檔中,資料均視為文字檔,每一個文字佔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
35
二進位檔可大量節省數值型之儲存空間 “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
36
二進位檔可大量節省數值型之儲存空間 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
37
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
38
Dim Sars As Single 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數控制 Dim Sars As Single Get #1,1,Sars Dim Sars As String*3 Get #1,1,Sars Dim Sars As Integer Get #1,1,Sars Dim Sars As Long Get #1,1,Sars
39
記錄(Record) 為何需要記錄(Record)?
在上一個範例中,我們可以從檔案中讀取3筆資料,由於每次的資料都存放在stu_id, ScoreComputer, ScoreMath, ScoreEng等變數中,因此無法一次儲存所有的資料 43
40
記錄(Record) 為了解決無法一起存放的問題,我們可以使用二維陣列來存放每一次讀取的資料,只需要使用簡單的迴圈即可完成,但是請注意當資料型態不一致時(例如:stu_id為字串,ScoreComputer為數值),我們必須要將陣列的資料型態宣告為Variant 。 44
41
記錄(Record) 如果我們想用之前學習的排序程式針對『計概』分數做排序,則陣列經由排序後會變成上圖之狀況
移動順序時若橫向列可以一併移動,才能解決這個問題,Visual Basic和其他的高階語言一樣,也提供了記錄(Record)資料型態。 45
42
記錄(Record) 「記錄」是由一些邏輯相關的「欄位」(Field)所構成。例如:一位學生的學號、計概成績、數學成績、英文成績就是一筆記錄,該記錄則擁有「學號」欄、「計概」欄、「數學」欄、「英文」欄,而一群學生的記錄集合將構成記錄陣列。 46
43
記錄(Record) 定義記錄型態的語法如下:
一個記錄資料型態包含許多「欄位」,每一個欄位都必須賦予一個欄位名稱。由於記錄是使用者自訂的資料型態,因此記錄在使用之前必須要先經過定義,然後在經過宣告後才可使用。 定義記錄型態的語法如下: 宣告記錄變數的語法如下: 語法: [Private|Public] Type記錄型態名稱 欄位名稱[(索引)] As資料型態 [欄位名稱[(索引)] As資料型態] End Type 功能:定義一個記錄型態包含哪些欄位以及各欄位的資料型態 。 語法:Dim 記錄變數名稱 As 記錄型態名稱 功能:宣告記錄變數為已定義的記錄資料型態 47
44
記錄(Record) 【範例】: 利用記錄型態來宣告一個成績的記錄。 一個記錄包括四個欄位如下: 學生學號:固定字串(8個字元)
計概成績:整數 數學成績:整數 英文成績:整數 其記錄型態定義格式如右: 上述定義代表有一個名稱為Score_Record記錄型態,當中包含有四個欄位,分別為固定字串變數stu_id、整數變數S_Computer、整數變數S_Math及、整數變數S_Eng。若要宣告含有五個記錄變數的記錄陣列Score,則可如下宣告: Type Score_Record stu_id As String * 8 S_Computer As Integer S_Math As Integer S_Eng As Integer End Type Dim Score(1 To 5) As Score_Record 48
45
13.4:記錄(Record) 經過上述宣告後,將會在主記憶體配置五個記錄變數,每個記錄變數都含有四個欄位,分別為Score(i).stu_id、Score(i).S_Computer、Score(i).S_Math、Score(i).S_Eng,且1≦i≦5。 該記錄陣列在主記憶體中的配置如下圖示意:
46
隨機檔 語法:Open "檔名" For Random As #檔案代碼[Len = 記錄長度] 功能:以隨機模式開啟檔案。 開檔隨機檔
【語法說明】: 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
47
隨機檔 存取隨機檔 隨機檔的每一筆記錄都有一個不同的記錄編號。要搜尋某一筆記錄時,必須在程式中輸入該筆記錄的編號,由於隨機檔每筆資料長度均相同,系統可以很快依公式算出該記錄編號的實際位置,然後將該筆記錄取出。因此隨機檔的資料是可以隨意存取(不必按照順序),平均存取速度比循序檔快許多,適合用時常更動內容的檔案。 Put敘述 Get敘述 語法:Put[#]檔案代碼,[記錄編號],變數 功能:寫入一筆資料到隨機檔中 語法:Get[#]檔案代碼,[記錄編號],變數 功能:從隨機檔中讀取一筆資料 52
48
Get #1,12,Bank 如上例, 直接讀取Bank變數 Dim A As Byte Dim B As Integer
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
49
Get #1,12,Bank Get #1,27,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
50
Get #1,1,Deposit Get #1,2,Deposit Random 模式 以Random 模式讀取第1筆資料:
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
Similar presentations