一、實(shí)驗(yàn)?zāi)康?br>??? (1)掌握順序文件、隨機(jī)文件、二進(jìn)制文件的特點(diǎn)及使用方法。
??? (2)熟練掌握文件的打開、關(guān)閉和讀寫命令。
??? (3)學(xué)會利用文件建立簡單的應(yīng)用程序。
二、相關(guān)知識
1.文件的基本概念及文件類型
??? “文件”是存放在外部介質(zhì)(磁盤、磁帶等)上的相關(guān)數(shù)據(jù)的集合,每一個(gè)文件都有文件名。根據(jù)文件中數(shù)據(jù)的存放形式,將數(shù)據(jù)文件分為3種類型,即順序文件、隨機(jī)文件和二進(jìn)制文件。對此,VB提供了3種文件訪問的類型:順序訪問、隨機(jī)訪問和二進(jìn)制訪問。
2.順序文件
??? 要處理的文件只包含文本信息,其中的數(shù)據(jù)沒有分成記錄,就可以使用順序型訪問。進(jìn)行順序訪問要用到以下3種打開文件的模式:
?● 讀文件:Open[路徑:]文件名[.擴(kuò)展名]? ForInput As #文件號。
?● 寫文件:Open[路徑:]文件名[.擴(kuò)展名]? For Output As #文件號。
?● 追加寫入:Open[路徑:]文件名[.?dāng)U展名]? For Append As #文件號。
3.隨機(jī)文件
??? 隨機(jī)文件是由一組相同長度的記錄組成,每個(gè)記錄包含一個(gè)或多個(gè)字段。具有一個(gè)字段的記錄對應(yīng)于任一標(biāo)準(zhǔn)類型,具有多個(gè)字段的記錄對應(yīng)于用戶定義類型。隨機(jī)文件對讀寫順序沒有限制,可以以記錄為單位,讀寫任何—條記錄。進(jìn)行隨機(jī)訪問要用到以下打開文件的模式:Open[路徑:]文件名[.?dāng)U展名]? For Random As #文件號 [Len = 記錄長度]
4.二進(jìn)制文件
??? 二進(jìn)制訪問是以字節(jié)為單位對文件進(jìn)行的訪問操作,它允許用戶讀寫文件的任何字節(jié)。通過使用二進(jìn)制訪問可使磁盤空間的使用降到最小,當(dāng)要保持文件的尺寸盡量小時(shí),應(yīng)使用二進(jìn)制型訪問。要打開二進(jìn)制訪問的文件,Open語句打開文件的方式如下:
??? Open[路徑:]文件名[.?dāng)U展名]? For Binary As #文件號
三、實(shí)驗(yàn)舉例
(實(shí)例1)已知某班學(xué)生成績文件為“grade.Dat”,該文件共有6個(gè)宇段:姓名、語文成績、數(shù)學(xué)成績、英語成績、計(jì)算機(jī)成績、總分:姓名字段為8個(gè)字符的字符型,其余宇段都是數(shù)值型。設(shè)該文件已經(jīng)按照總分降序排序,輸入一個(gè)總分,請用折半查找的方法查找該班是否存在某分?jǐn)?shù)的人,若找到,輸出該學(xué)生的情況,否則輸出沒有找到。
根據(jù)上述描述,進(jìn)行如下操作:
(1)首先在模塊中建立如下結(jié)構(gòu):
Type? stdinfo
?????? name? AS? String? * 8
?????? yuwen AS Integer
?????? math? AS Integer
?????? english AS Integer
?????? xgrade AS Integer
?????? sum? AS? Integer
End Type
(2)將學(xué)生信息(包括:姓名、4門課成績)放入到abc.txt文件中。
”張三”,98,97,96,94
”李四”,94,96,95,95
“王五”,92,90,98,93
“趙六”,90,96,92,88
“孫七”,88,92,86,84
“馬八”,93,86,88,80
“武九”,90,84,80,82
“劉一”,86,80,85,83
“曹二”,78,90,82,80
然后用如下代碼將上面數(shù)據(jù)的文件變成為隨機(jī)文件“grade.dat”。
Private? Sub? Command2? Click()
Dim? filenol? AS? integer,? fileno2 AS? integer
Dim? std? AS? Stdinfo
Dim? C? AS? integer
Filenol=FreeFile
Open? App.Path? &? ”\abc.Txt” For? input? AS? #fileno1
fileno2? = FreeFile
Open App.Path & ”\grade.dat”For Random as #fileno2 len = Len(std)
C? = 1
Do? While? Not? EOF(filenol)
??????? input? #fileno1,? Std.name,Std.yuwen,? Std.math,_
std.english,? std.xgrade
??????? std.sum? =? Std.yuwen +Std.Math + std.English + std.xgrade
??????? Put? #fileno2,? C,? std
??????? C =? C? +? 1
??? Loop
???? Close?? #fileno2
???? Close?? #fileno1
End? Sub
(3) 進(jìn)行折半查找。
Private? Sub? Form_load()
??? Forml.Caption = “學(xué)生成績折半查找”
End? Sub
Private? Sub? Commandl_click()
??? Dim? fileno? AS? integer
??? Dim? low AS? integer
??? Dim? mid? AS? integer
??? Dim? high? AS? integer
Dim? Std? AS? Stdinfo
??? Dim? c AS? integer
??? fileno? =? FreeFile
Open App.Path &? ”\grade.dat” For Random as #fileno len = Len(std)
high? =? LOF(fileno)? \? Len(Std)
??? c =? inputbox( “輸入一個(gè)總分”)
do While? low <= high
mid? =? (low? +? high)? \? 2
Get? #fileno,? mid,? Std
if? Std.sum? >? C? Then
??? low = mid+? l
Elseif? Std.sum? C? Then
??? High = mid? -? l
ElSe
??? Exit? do
??? End? if
Loop
??? if? low? <=? high? Then
?????? Print? Std.name,Std.yuwen,Std.math,Std.engliSh,Std.xgrade,Std.sum
??? Else
?????? Print“成績”;c;? ”沒有找到”
??? End? if
??? Close? #fileno
End? Sub
程序運(yùn)行時(shí)輸入334,結(jié)果為________。
評論
查看更多