Transcript 檔案與資料存取
檔案與資料存取
Open "C:\test.tmp" For Output As #1
Str1 = “中華民國萬歲"
Val1 = 7654321
Write #1, Str1, Val1
Str1 = “三民主義萬歲"
Val1 = 1234567
Write #1, Str1, Val1
C:
Close #1
C:\test.tmp
【實例:輸出到表單】
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,
通用對話框
與路徑設定有關之控制項
DriveListBox
縮寫Drive
DirListBox
縮寫Dir
FileListBox
縮寫File
檔名有關物件之
一般設計
顯示在Text1框
決定選擇的檔案
Dir1
File1
Text1
若改變
Drive1
Combo1
若改變則顯示檔案型式改變
利用Common Dialog Control可快速獲得
存取檔案視窗
Action=1
開啟檔案視窗
Action=2
儲存檔案視窗
Action=3
選取色彩視窗
Open 檔名 For 存取模式 As #緩衝區代
號...
關於緩衝區編號
緩衝區是主記憶體開闢的一塊記憶體,作
為使用者存取磁碟資料的資料暫存區,當
資料存放達到緩衝區的大小或宣告關閉
緩衝區時(Close) ,電腦才一口氣將緩衝
區之資料存入磁碟之中。
緩衝區代號最多達512個
每一個緩衝區之長度預設為512 bytes
緩衝區
#512
#511
#510
#509
資
資料
資料
資
料資
料
料 FAST
磁碟機
檔案 2
檔案 1
#2
#1
SLOW
FreeFile函數
Open 檔名 For 存取模式 As #緩衝區代號...
存取模式: 循序存取(Sequential Access)
二元存取(Binary Access)
隨機存取(Random Access)
循序存取(Sequential Access)
存檔
Open filename For Output As #1
變數
寫入
資料
讀檔
Open filename For Input As #1
讀取
資料
變數
存檔語法
Open filename For Output As #1
Print #1, 資料1
WordPad
Print #1, 資料2
Close #1
資料1
資料2
filename
存檔語法
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 中華民國萬歲 7654321
Close #1
三民主義萬歲 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 “中華民國萬歲”,7654321
Close #1
“三民主義萬歲”,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 #』敘述(讀取資料)
語法:Input #檔案代碼,變數1[,變數2]…
功能:從檔案代碼對應的循序資料檔中依序讀出資料並存放到指定的變數中
– 【語法說明】:
• 變數1、變數2、、可以為數值、字串或陣列變數。
• 變數的資料型態最好與檔案的資料型態相符,並且檔案的數值資
料可以讀入字串變數,但檔案的字串資料不可以讀入數值變數中
。
• 循序檔中若同時包含有文字與數值資料,在存檔時,最好不要使
用『Print #』敘述存檔,否則使用『Input #』敘述來讀取資料時
,可能會發生錯誤。
25
循序檔資料讀取
• 『Line Input #』敘述(讀取整列資料)
語法:Line Input #檔案代碼,字串變數
•
功能:從檔案代碼對應的循序資料檔中一次讀取一列資料並
存放到指定的變數中
– 【語法說明】:
• 1. 字串變數:存放檔案整列的資料。由於一次讀
一列資料,因此不論資料是數值還是字元,都會
被當成是字串的一部份,因此不可使用數值變數
來存放讀取到的整列資料。
• 2. 『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 C:\test.tmp
Str1 = “消滅萬惡共匪”
Write #1, Str1
“中華民國萬歲”
Str1 = “解救大陸同胞”
“三民主義萬歲”
Print #1, Str1
“消滅萬惡共匪”
Close #1
End Sub
“解救大陸同胞”
範例:製作一個程式使用記錄檔
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)!
循序檔內之資料以文字型態儲存,以1
byte為存取單位,因此只要以文字編輯
器開啟之,便可了解其儲存格式,修改及
處理容易,但其缺點為:
•資料保密性差
•較佔儲存空間(對數值型資料而言)
•無法直接針對某一筆資料進行存取
以Binary方式存取可滿足上述之缺失
在循序檔中,資料均視為文字檔,每一
個文字佔1位元組(Byte)之空間
Open “C:\test.txt” _
“A”,”A”,”A”,”A”,….
for output as #1
共需1024 x 4 bytes
Dim I
= 4096 bytes
For I = 1 to 1024
= 4 Kb
Write #1, “A”,
1,1,1,1,1,1,…...
Write #1, 1,
共需1024 x 2 bytes
Next I
= 2048 bytes
Close #1
= 2 Kb
二進位檔可大量節省數值型之儲存空間
Open “C:\test.txt” _
“A”,”A”,”A”,”A”,….
for output as #1
共需1024 x 4 bytes
For I = 1 to 1024
= 4096 bytes
Write #1, “A”,
= 4 Kb
Write #1, 10000,
10000,10000,…
Next I
共需1024* 6 bytes
Close #1
= 6Kb
二進位檔可大量節省數值型之儲存空間
Dim I as integer
AAAA…..
For I = 1 to 1024
共需1024 x 1 bytes
put #1, ,“A”,
= 1024 bytes
put #2, ,10000,
= 1 Kb
Next I
亂碼
共需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
循序檔每次讀 1 byte, 僅能依序讀取,無法直接
讀取特定的byte
= 1 byte
I L I K E ½睡
¤覺
二進位檔每次讀取之byte數依變數型別而異, 且
可任意讀取特定位置,以指標值所指byte數控制
Dim Sars As Single
Integer
Long
String*3
Get #1,1,Sars
記錄(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個字元)
• 計概成績:整數
Type Score_Record
• 數學成績:整數
stu_id As String * 8
• 英文成績:整數
S_Computer As Integer
其記錄型態定義格式如右:
S_Math As Integer
S_Eng As Integer
End Type
上述定義代表有一個名稱為Score_Record記錄型態,當
中包含有四個欄位,分別為固定字串變數stu_id、整數
變數S_Computer、整數變數S_Math及、整數變數S_Eng
。若要宣告含有五個記錄變數的記錄陣列Score,則可
如下宣告:
Dim Score(1 To 5) As Score_Record
48
13.4:記錄(Record)
– 經過上述宣告後,將會在主記憶體配置五個記
錄變數,每個記錄變數都含有四個欄位,分別
為Score(i).stu_id、Score(i).S_Computer、
Score(i).S_Math、Score(i).S_Eng,且1≦i≦5。
該記錄陣列在主記憶體中的配置如下圖示意:
隨機檔
• 開檔隨機檔
•
語法: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』。
50
隨機檔
• 存取隨機檔
– 隨機檔的每一筆記錄都有一個不同的記錄編號。要搜尋某
一筆記錄時,必須在程式中輸入該筆記錄的編號,由於隨
機檔每筆資料長度均相同,系統可以很快依公式算出該記
錄編號的實際位置,然後將該筆記錄取出。因此隨機檔的
資料是可以隨意存取(不必按照順序),平均存取速度比
循序檔快許多,適合用時常更動內容的檔案。
• Put敘述
語法:Put[#]檔案代碼,[記錄編號],變數
功能:寫入一筆資料到隨機檔中
• Get敘述
語法:Get[#]檔案代碼,[記錄編號],變數
功能:從隨機檔中讀取一筆資料
52
如上例, 直接讀取Bank變數
Dim
Dim
Dim
Dim
A
B
A As
B As
C As
Bank
A=1 byte
Byte
Integer
Double
As Single
C
Get #1,12,Bank
B=2 bytes
C=8 bytes
Bank = 4 bytes
D
Dim
Dim
Dim
Dim
A As
B As
C As
Bank
Byte
Integer
Double
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