檔案與資料存取

50
檔檔檔檔檔檔檔

Upload: amos-martin

Post on 03-Jan-2016

74 views

Category:

Documents


0 download

DESCRIPTION

檔案與資料存取. 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 - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 檔案與資料存取

檔案與資料存取

Page 2: 檔案與資料存取

Open "C:\test.tmp" For Output As #1 Str1 = “ 中華民國萬歲 " Val1 = 7654321 Write #1, Str1, Val1 Str1 = “ 三民主義萬歲 " Val1 = 1234567 Write #1, Str1, Val1 Close #1

C:

C:\test.tmp

Page 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

Print

Next I

End Sub

Page 4: 檔案與資料存取

【實例:輸出到檔案】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

Page 5: 檔案與資料存取

開啟檔案之語法Open 檔名 For 存取模式 [Access 存取屬

性 ][ 鎖護 ] As [#] n [Len= 記錄長度 ]

檔名 : 磁碟代號 + 目錄 + 檔名 --> 完整路徑

存取模式 : 循序存取 (Sequential Access)

二元存取 (Binary Access)

隨機存取 (Random Access)

#n: 緩衝區或資料暫存區代號

Page 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”

Page 7: 檔案與資料存取

檔名指定1. 直接指定Open “A:\SPP\LKK\5630.txt” for Input As #1

2. 變數指定Filename1=“C:\VB6\samples\data1.dat”Filename2=Text1.TextFilename3=Combo1.TextOpen Filename1 for Output As #1Open Filename2 for Output As #2Open Filename3 for Output As #3

3. 利用檔案管理相關物件DriveListBox, DirListBox, FileListBox,通用對話框

Page 8: 檔案與資料存取

與路徑設定有關之控制項

DriveListBox縮寫 Drive

DirListBox縮寫 Dir

FileListBox縮寫 File

Page 9: 檔案與資料存取

Drive1Drive1

Dir1Dir1File1File1

Combo1

Text1

若改變則顯示檔案型式改變

若改變則顯示目錄改變

檔名有關物件之一般設計

顯示該目錄之檔名

決定選擇的檔案顯示在 Text1 框

Page 10: 檔案與資料存取

利用 Common Dialog Control 可快速獲得存取檔案視窗

Action=1開啟檔案視窗

Action=2儲存檔案視窗

Action=3 選取色彩視窗

Page 11: 檔案與資料存取

Open 檔名 For 存取模式 As # 緩衝區代號 ...

關於緩衝區編號緩衝區是主記憶體開闢的一塊記憶體,作為使用者存取磁碟資料的資料暫存區,當資料存放達到緩衝區的大小或宣告關閉緩衝區時 (Close) ,電腦才一口氣將緩衝區之資料存入磁碟之中。

緩衝區代號最多達 512 個每一個緩衝區之長度預設為 512 bytes

Page 12: 檔案與資料存取

#1#2

#509#510#511#512

檔案 1檔案 2

緩衝區

磁碟機

資料

資料

資料

資料

資料

FAST SLOW

Page 13: 檔案與資料存取

FreeFile 函數

Page 14: 檔案與資料存取

Open 檔名 For 存取模式 As # 緩衝區代號 ...

存取模式 : 循序存取 (Sequential Access) 二元存取 (Binary Access) 隨機存取 (Random Access)

Page 15: 檔案與資料存取

循序存取 (Sequential Access)

讀檔Open filename For Input As #1

存檔Open filename For Output As #1

資料 變數讀取

變數寫入

資料

Page 16: 檔案與資料存取

存檔語法Open filename For Output As #1Print #1, 資料 1Print #1, 資料 2Close #1

filename

資料 1

資料 2

WordPad

Page 17: 檔案與資料存取

存檔語法Open filename For Output As #1Print #1, 資料 1, 資料 2Close #1

filename

資料 1 資料 2

Page 18: 檔案與資料存取

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

filename

中華民國萬歲 7654321

三民主義萬歲 1234567

空 14 格

Page 19: 檔案與資料存取

存檔語法Open filename For Output As #1Write #1, 資料 1Write #1, 資料 2Close #1

filename

資料 1

資料 2

Page 20: 檔案與資料存取

存檔語法Open filename For Output As #1Write #1, 資料 1, 資料 2Close #1

filename

資料 1, 資料 2

Page 21: 檔案與資料存取

讀檔語法Open filename For Input As #1Input #1, 變數 1, 變數 2Close #1

filename 資料 1, 資料 2

Write #1, 資料 1, 資料 2

資料 1 資料 2

變數 1 變數 2

Page 22: 檔案與資料存取

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

filename

“中華民國萬歲” ,7654321

“三民主義萬歲” ,1234567

以逗號分隔

Page 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 = 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 #1End Sub

Page 24: 檔案與資料存取

Print與 Write 存檔之差異• Print 將存入之資料視為文字檔• Write 保留變數之型態

(故 Print 方式存檔較適合儲存文字檔 ,Write 則較適用資料檔 )

Page 25: 檔案與資料存取

25

循序檔資料讀取• 循序檔-讀取資料

– 在 Visual Basic 中,讀取循序檔的資料則可以透過『 Input # 』敘述、『 Line Input # 』敘述及『 Input 』函數來完成。

• 『 lnput # 』敘述(讀取資料)

– 【語法說明】:• 變數 1 、變數 2 、、可以為數值、字串或陣列變數。• 變數的資料型態最好與檔案的資料型態相符,並且檔案的數值資料

可以讀入字串變數,但檔案的字串資料不可以讀入數值變數中。• 循序檔中若同時包含有文字與數值資料,在存檔時,最好不要使用

『 Print # 』敘述存檔,否則使用『 Input # 』敘述來讀取資料時,可能會發生錯誤。

語法: Input #檔案代碼 , 變數 1[,變數 2]…功能:從檔案代碼對應的循序資料檔中依序讀出資料並存放到指定的變數中

Page 26: 檔案與資料存取

26

循序檔資料讀取• 『 Line Input # 』敘述(讀取整列資料)

– 【語法說明】:• 1. 字串變數:存放檔案整列的資料。由於一次讀一列資料

,因此不論資料是數值還是字元,都會被當成是字串的一部份,因此不可使用數值變數來存放讀取到的整列資料。

• 2. 『 Line Input # 』敘述將讀取整列的資料,直到碰上換列字元為止。不論該列資料中出現任何的字元都被當成一個普通的字元而已,即使是逗號字元與空白字元也是不具任何特殊意義的。

語法: Line Input #檔案代碼 , 字串變數功能:從檔案代碼對應的循序資料檔中一次讀取一列資料並存放到指定的變數中

Page 27: 檔案與資料存取

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 #1End Sub

使用 Line Input 讀取一整行資料

Page 28: 檔案與資料存取

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 #1End Sub

Append 存檔模式

Open filename For Append As #1

“中華民國萬歲”

“ 三民主義萬歲”

把資料添增到檔案裡

“消滅萬惡共匪”

“ 解救大陸同胞”

C:\test.tmp

Page 29: 檔案與資料存取

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

範例 : 製作一個程式使用記錄檔

Page 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 #1End Sub

Page 31: 檔案與資料存取
Page 32: 檔案與資料存取

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)!

Page 33: 檔案與資料存取

循序檔內之資料以文字型態儲存 ,以 1 byte 為存取單位 , 因此只要以文字編輯器開啟之 , 便可了解其儲存格式 , 修改及處理容易 , 但其缺點為 :

•資料保密性差•較佔儲存空間 ( 對數值型資料而言 )

•無法直接針對某一筆資料進行存取

以 Binary 方式存取可滿足上述之缺失

Page 34: 檔案與資料存取

在循序檔中 , 資料均視為文字檔 , 每一個文字佔 1 位元組 (Byte) 之空間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

“A”,”A”,”A”,”A”,….

1,1,1,1,1,1,…...

共需 1024 x 4 bytes

= 4096 bytes

= 4 Kb

共需 1024 x 2 bytes

= 2048 bytes

= 2 Kb

Page 35: 檔案與資料存取

Open “C:\test.txt” _

for output as #1

For I = 1 to 1024

Write #1, “A”,

Write #1, 10000,

Next I

Close #1

“A”,”A”,”A”,”A”,….

10000,10000,…

共需 1024 x 4 bytes

= 4096 bytes

= 4 Kb

共需 1024* 6 bytes

= 6Kb

二進位檔可大量節省數值型之儲存空間

Page 36: 檔案與資料存取

二進位檔可大量節省數值型之儲存空間

Dim I as integer

For I = 1 to 1024

put #1, ,“A”,

put #2, ,10000,

Next I

AAAA…..

亂碼

共需 1024 x 1 bytes

= 1024 bytes

= 1 Kb

共需 1024 x 2 bytes

= 2048 bytes

= 2 Kb

Page 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

Page 38: 檔案與資料存取

循序檔每次讀 1 byte, 僅能依序讀取 , 無法直接讀取特定的 byte

= 1 byte

I L I K E 睡 覺

二進位檔每次讀取之 byte 數依變數型別而異 , 且可任意讀取特定位置 , 以指標值所指 byte 數控制

½ ¤

Dim Sars As IntegerGet #1,1,SarsDim Sars As LongGet #1,1,SarsDim Sars As String*3Get #1,1,SarsDim Sars As SingleGet #1,1,Sars

Page 39: 檔案與資料存取

43

記錄 (Record)• 為何需要記錄 (Record)?

– 在上一個範例中,我們可以從檔案中讀取 3 筆資料,由於每次的資料都存放在 stu_id, ScoreComputer, ScoreMath, ScoreEng 等變數中,因此無法一次儲存所有的資料

Page 40: 檔案與資料存取

44

記錄 (Record)– 為了解決無法一起存放的問題,我們可以使用二維

陣列來存放每一次讀取的資料,只需要使用簡單的迴圈即可完成,但是請注意當資料型態不一致時(例如: stu_id 為字串, ScoreComputer 為數值),我們必須要將陣列的資料型態宣告為 Variant

– 。

Page 41: 檔案與資料存取

45

記錄 (Record)

– 移動順序時若橫向列可以一併移動,才能解決這個問題, Visual Basic 和其他的高階語言一樣,也提供了記錄( Record )資料型態。

如果我們想用之前學習的排序程式針對『計概』分數做排序,則陣列經由排序後會變成上圖之狀況

Page 42: 檔案與資料存取

46

記錄 (Record)– 「記錄」是由一些邏輯相關的「欄位」( Field )所構成。例如

:一位學生的學號、計概成績、數學成績、英文成績就是一筆記錄,該記錄則擁有「學號」欄、「計概」欄、「數學」欄、「英文」欄,而一群學生的記錄集合將構成記錄陣列。

Page 43: 檔案與資料存取

47

記錄 (Record)– 一個記錄資料型態包含許多「欄位」,每一個欄位都必須賦予一個欄位名稱

。由於記錄是使用者自訂的資料型態,因此記錄在使用之前必須要先經過定義,然後在經過宣告後才可使用。

• 定義記錄型態的語法如下:

– 宣告記錄變數的語法如下:

語法: [Private|Public] Type記錄型態名稱   欄位名稱 [(索引 )] As資料型態   [ 欄位名稱 [(索引 )] As資料型態 ] End Type功能:定義一個記錄型態包含哪些欄位以及各欄位的資料型態 。

語法: Dim 記錄變數名稱 As 記錄型態名稱功能:宣告記錄變數為已定義的記錄資料型態

Page 44: 檔案與資料存取

48

記錄 (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 IntegerEnd Type

Dim Score(1 To 5) As Score_Record

Page 45: 檔案與資料存取

13.4 :記錄 (Record)– 經過上述宣告後,將會在主記憶體配置五個記

錄變數,每個記錄變數都含有四個欄位,分別為Score(i).stu_id 、 Score(i).S_Computer 、 Score(i).S_Math 、 Score(i).S_Eng ,且 1 i 5≦ ≦ 。該記錄陣列在主記憶體中的配置如下圖示意:

Page 46: 檔案與資料存取

50

隨機檔• 開檔隨機檔

– 【語法說明】:• 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 = 記錄長度 ]功能:以隨機模式開啟檔案。

Page 47: 檔案與資料存取

52

隨機檔• 存取隨機檔

– 隨機檔的每一筆記錄都有一個不同的記錄編號。要搜尋某一筆記錄時,必須在程式中輸入該筆記錄的編號,由於隨機檔每筆資料長度均相同,系統可以很快依公式算出該記錄編號的實際位置,然後將該筆記錄取出。因此隨機檔的資料是可以隨意存取(不必按照順序),平均存取速度比循序檔快許多,適合用時常更動內容的檔案。

• Put 敘述

• Get 敘述語法: Put[#]檔案代碼 ,[記錄編號 ],變數功能:寫入一筆資料到隨機檔中

語法: Get[#]檔案代碼 ,[記錄編號 ],變數功能:從隨機檔中讀取一筆資料

Page 48: 檔案與資料存取

如上例 , 直接讀取 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

Get #1,12,Bank

Page 49: 檔案與資料存取

想像若要連續讀取 Bank 變數 , 則讀取第 1筆為

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

Get #1,27,Bank

想像若要連續讀取 Bank 變數 , 則讀取第 2筆為

Get #1,12,Bank

Page 50: 檔案與資料存取

Open 檔名 For Random As 緩衝區編號 Len = 結構變數長度

Type Money Dim A As Byte Dim B As Integer Dim C As Double Dim Bank As SingleEnd Type

Open “c:\test.bin" For Random As #1 Len =Len(Deposit)以 Random 模式讀取第 1 筆資料 :

Get #1,1,Deposit

Random 模式

以 Random 模式讀取第 2 筆資料 :

Get #1,2,Deposit

Dim Deposit as Money