版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第10章文件
10.1順序文件10.2隨機文件10.3二進制文件10.4與文件系統(tǒng)相關(guān)的控件習(xí)題使用文件是長久保存數(shù)據(jù)的有效且簡便的方法。文件是存儲在某種存儲介質(zhì)上的數(shù)據(jù)的集合,通常由一組相關(guān)字節(jié)組成。當應(yīng)用程序要訪問文件時,必須自己決定文件中字節(jié)的意義(比如,表示字符、字符串、整數(shù)、數(shù)據(jù)記錄等)。文件在存儲介質(zhì)上的位置是依賴于驅(qū)動器名、文件夾(目錄)和文件名來定位的。
VisualBasic提供了對文件的讀寫能力。為能有效地存取數(shù)據(jù),訪問文件時,應(yīng)根據(jù)文件中存儲的數(shù)據(jù)的不同類型,采用不同的方法進行訪問。VisualBasic中有三種文件訪問類型?!耥樞蛐停河糜谧x寫連續(xù)的文本文件?!耠S機型:用于讀寫有固定長度記錄結(jié)構(gòu)的文本文件或者二進制文件?!穸M制型:用于讀寫任意結(jié)構(gòu)的文件。
VB中,根據(jù)文件的結(jié)構(gòu)和訪問方式,將文件分成順序文件、隨機文件和二進制文件。文件處理可以通過使用Open語句以及其他一些相關(guān)的語句和函數(shù)來實現(xiàn),也可以通過使用FSO對象模型來實現(xiàn)。應(yīng)用程序訪問上述三種文件的步驟是相同的:①使用Open語句打開文件;②從文件中讀取數(shù)據(jù)或?qū)?shù)據(jù)寫到文件中;③使用Close語句關(guān)閉文件。10.1順序文件
VisualBasic6.0中,順序文件實際上指的就是文本文件,這種文件中的數(shù)據(jù)由文本字符組成。這些字符既可以是ASCII碼字符集中的可顯示字符,也可以是漢字字符。順序文件按行組織,每一行的結(jié)尾由“回車”和“換行”字符指示?!盎剀嚒弊址腁SCII碼為13,“換行”字符的ASCII碼為10。當用戶要處理只包含文本的文件時,最好使用順序型訪問。順序型訪問不太適合有很多數(shù)字的文件,因為每個數(shù)據(jù)都要按字符串存儲,可能比較浪費存儲空間。如一個4位整數(shù)將需要4個字節(jié)的存儲空間,而它作為一個正數(shù)來存儲時只需2個字節(jié)。案例1順序文件的使用
1.學(xué)習(xí)目標設(shè)計一個演示順序文件讀寫操作的程序,程序運行界面如圖10.1所示。要求該程序可以打開一個順序文件“D:\text.txt”,并將其內(nèi)容讀入文本框中進行修改,然后將修改好的內(nèi)容保存回原文件。圖10.1順序文件程序設(shè)計界面
2.相關(guān)知識如果要編輯一個順序文件,需要先打開該文件,再把它的內(nèi)容讀入到程序變量,然后改變這些變量,最后再把這些變量寫回到該文件。
1)順序文件的打開使用順序文件之前,應(yīng)先用Open語句打開它。Open語句的語法如下:
OpenpathnameFormode[access][lock]As[#]filenumber[Len=reclength]其中各參數(shù)的含義如下:●??pathname:必選參數(shù),由字符串表達式組成。它指定文件名,該文件名可能還包括目錄、文件夾及驅(qū)動器?!駇ode(模式):必選參數(shù),它指定文件的打開方式。對順序文件有Append、Input和Output三種模式,其含義如表10.1所示。如果未指定方式,則以Random訪問方式打開文件(隨機文件)。表10.1順序文件的三種打開模式當用Input模式打開順序文件時,該文件必須存在,否則會出現(xiàn)錯誤。但是,當以O(shè)utput或Append模式打開一個不存在的文件時,Open語句會首先創(chuàng)建該文件,然后再打開它。●?access:可選參數(shù),它說明對打開的文件可以進行的操作類型,即能對文件進行哪種操作,對文件的存取限定了約束條件。表10.2列出了順序文件的操作類型。表10.2順序文件的操作類型●lock(鎖定):可選參數(shù),它說明其他進程能否對打開的文件進行操作,用于多進程網(wǎng)絡(luò)環(huán)境中。lock類型可采用的參數(shù)如表10.3所示。表10.3Lock類型可采用的參數(shù)●?filenumber:必選參數(shù),它是一個有效的文件號。文件號是在Open語句中用來標識打開文件的數(shù)值,范圍為1~511。當打開某文件并為其指定文件號以后,該號就代表了被打開的文件,任何對該文件號進行操作的語句都將影響相應(yīng)的文件內(nèi)容,文件被關(guān)閉后,此文件號可以再供其他文件使用。為了保證應(yīng)用程序不使用正在使用的文件號,可以使用FreeFile()函數(shù)得到下一個可用的文件號?!駌eclength:可選參數(shù),它是小于或等于32?767(字節(jié))的一個數(shù),它指定用于數(shù)據(jù)交換時數(shù)據(jù)緩沖區(qū)的大小。對于順序文件,該值就是緩沖字符數(shù);對于用隨機訪問方式打開的文件,該值就是記錄長度。在Windows中,數(shù)據(jù)要存儲到文件中時,不是直接存到磁盤上,而先存到一個內(nèi)存里的數(shù)據(jù)緩沖區(qū)中,直到裝滿后才存盤或當文件關(guān)閉時一起存盤。用戶可在打開文件時設(shè)定參數(shù),修改系統(tǒng)設(shè)置。較大的參數(shù)表示數(shù)據(jù)占用較大的內(nèi)存空間,但可提高文件的輸入或輸出速度;該參數(shù)較小時,表示數(shù)據(jù)占用空間小,文件的交換速度較慢。例如,以順序輸入模式打開Textnew.txt文件可用下列語句實現(xiàn):
Open"Textnew.txt"ForInputAs#1
2)向順序文件中寫數(shù)據(jù)應(yīng)用程序在向順序文件中寫入數(shù)據(jù)前,應(yīng)先根據(jù)是否要覆蓋原文件來選擇以O(shè)utput或Append模式打開它。當以O(shè)utput模式打開文件時,寫操作語句從數(shù)據(jù)文件的最前面開始寫入。如果文件已存在,則文件中原來的內(nèi)容會被覆蓋;若文件不存在,則會建立一個新文件,將數(shù)據(jù)從頭開始寫入。當文件以Append模式打開時,如果文件已經(jīng)存在,則在寫入數(shù)據(jù)時不會將原來的數(shù)據(jù)覆蓋,而是從文件末尾開始,將新數(shù)據(jù)添加到文件中。下面兩種語句可實現(xiàn)向順序文件中寫入數(shù)據(jù)的操作。
(1)?Write#語句。功能:將數(shù)據(jù)寫入文件號指定的順序文件。每執(zhí)行一次Write語句,該語句就會在輸出的數(shù)據(jù)后面自動添加一個回車換行字符。語法格式:
Write#filenumber,[outputlist]其中,outputlist參數(shù)是可選項,代表要寫入文件的數(shù)值表達式或字符串表達式,表達式間用逗號分開。如果省略outputlist,并在filenumber之后加上一個逗號,則會將一個空白行輸出到文件中。例如:用Write#語句將行數(shù)據(jù)寫入順序文件。
Open"Testnew.txt"ForOutputAs#1 '打開輸出文件
Write#1,"向順序文件中寫入數(shù)據(jù)",100 '寫入以逗號隔開的數(shù)據(jù)
Write#1, '寫入空白行
(2)?Print#語句。功能:將格式化顯示的數(shù)據(jù)寫入順序文件中。語法格式:
Print#filenumber,[outputlist]例如:用Print#?語句將數(shù)據(jù)寫入一個文件。
Open"Test.txt"ForOutputAs#1 '打開輸出文件
Print#1,"順序文件" '將文本數(shù)據(jù)寫入文件
Print#1,'將空白行寫入文件
Print#1,Spc(5);"向順序文件中寫入數(shù)據(jù)"
'在字符串之前寫入5個空格與Print#?語句不同,當要將數(shù)據(jù)寫入文件時,Write#?語句會在項目和用來標記字符串的引號之間插入逗號。Write#語句在將“outputlist”中的最后一個字符寫入文件后插入一個新行字符,即回車換行符(Chr(13)+Chr(10))。
3)從順序文件中讀數(shù)據(jù)要讀取順序文件中的內(nèi)容,應(yīng)用Open語句以Input模式打開該文件,然后根據(jù)用戶的不同需要,使用Input#?語句或LineInput#?或Input()將文件內(nèi)容讀入到程序變量中。
(1)?Input#?語句。功能:Input?#?語句將文件中的逗號(不包括引號中的逗號)和回車換行符作為數(shù)據(jù)項的分隔符,順序地從指定的文件(由文件號指定)中讀取數(shù)據(jù),并把讀出的數(shù)據(jù)存放到參數(shù)表指定的變量中。語法格式:
Input#filenumber,varlist其中,參數(shù)varlist為變量表,這些變量不能是數(shù)組或?qū)ο笞兞?,變量間用逗號分隔開。Input#語句將從文件中讀出的值分配給這些變量,一次讀取的數(shù)據(jù)項的個數(shù)與varlist中變量的個數(shù)相等,順序必須相同,且與相同數(shù)據(jù)類型的變量匹配。如果變量為數(shù)值類型,而數(shù)據(jù)不是數(shù)值類型,則指定變量的值為零。當文件中余下的數(shù)據(jù)項的個數(shù)多于參數(shù)表中變量的個數(shù)時,Input?#?語句讀出相應(yīng)個數(shù)的數(shù)據(jù)項,并把文件指針移動到下一個數(shù)據(jù)項上;當文件中余下的數(shù)據(jù)項的個數(shù)少于Input#語句參數(shù)表中變量的個數(shù)時,再次執(zhí)行Input?#?語句將導(dǎo)致錯誤。為了避免發(fā)生這種情況,在使用Input#?語句讀取數(shù)據(jù)之前,應(yīng)該使用EOF()函數(shù)判斷是否已經(jīng)讀到了文件的末尾。當已經(jīng)讀到文件末尾時,EOF()函數(shù)返回True,否則返回False。
EOF()函數(shù)的語法格式:
EOF(filenumber)為了能夠用Input?#?語句將文件的數(shù)據(jù)正確讀入到變量中,在將數(shù)據(jù)寫入文件時,要使用Write#語句而不是Print#語句。因為使用Write#語句可以確保將各個單獨的數(shù)據(jù)域正確分隔開,所以可用Input#?語句再將數(shù)據(jù)讀出來。例如:用Input?#?語句將順序文件Testnew.txt內(nèi)的數(shù)據(jù)讀入到兩個變量中。假設(shè)Testnew.txt文件內(nèi)含數(shù)行以Write?#?語句寫入的數(shù)據(jù),即每一行數(shù)據(jù)中的字符串部分都用雙引號括起來,而與數(shù)字用逗號隔開,如("Welcome",100)。
DimMyString,MyNumber
Open"Testnew.txt"ForInputAs#1
DowhileNotEOF(1)
Input#1,MyString,MyNumber'將數(shù)據(jù)讀入到兩個變量
PrintMyString,MyNumber
Loop其中,EOF()返回一個Boolean值,當Boolean值為True時,表明已經(jīng)到達以Input模式打開的順序文件的末尾。若未到達文件的末尾,則EOF()函數(shù)返回False。
(2)?LineInput?#?語句。功能:LineInput?#?語句可以一次讀取一行文本,并將它分配給字符串類型變量。語法格式:
LineInput#filenumber,varname其中,varname是用來存放讀取內(nèi)容的Variant或String變量名。用LineInput#語句一次只能從文件中讀取一行字符,直到遇到回車符或回車換行符時為止。逗號不是該語句的分隔符?;剀嚀Q行符將被跳過,而不會被附加到字符串上,因此,如果要保留該回車換行符,則必須用代碼添上。例如:用LineInput#語句從順序文件Testnew.txt中讀入一行數(shù)據(jù),并將該行數(shù)據(jù)賦予一個變量。假設(shè)順序文件Testnew.txt內(nèi)含數(shù)行文本數(shù)據(jù)。
DimTextLineAsString
Open“Testnew.txt”ForInputAs#1
'打開文件
DoWhileNotEOF(1)
'循環(huán)至文件尾
LineInput#1,TextLine
'讀入一行數(shù)據(jù)并將其賦予某變量
PrintTextLine
'窗口中顯示數(shù)據(jù)
Loop
(3)?Input()函數(shù)。功能:該函數(shù)返回String,它包含以Input模式打開的文件中的字符。語法格式:
Input(number,[#]filenumber)其中,number參數(shù)是任何有效的數(shù)值表達式,指定要返回的字符個數(shù);filenumber是任何有效的文件號。與Input?#?語句不同,Input()函數(shù)返回它所讀出的所有字符,包括逗號、回車符、空白列、換行符、引號和前導(dǎo)空格等。例如:用Input()函數(shù)一次讀取順序文件Testnew.txt中的一個字符,并將它顯示出來。假設(shè)Testnew.txt文件內(nèi)含數(shù)行文本數(shù)據(jù)。
DimMyChar
Open"Testnew.txt"ForInputAs#1
DoWhileNotEOF(1)
MyChar=Input(1,#1)'一次讀入一個字符
PrintMyChar
Loop
4)順序文件的關(guān)閉對文件進行讀寫操作之后,必須將文件關(guān)閉,否則會造成文件中數(shù)據(jù)的丟失。這是因為,將數(shù)據(jù)寫入文件實際上是將數(shù)據(jù)寫入緩沖區(qū),關(guān)閉文件才能將緩沖區(qū)中剩余數(shù)據(jù)全部寫入文件內(nèi)。關(guān)閉文件可采用Close語句。
Close語句的語法格式:
Close[filenumberlist]其中,參數(shù)filenumberlist代表一個或多個文件號,若省略filenumberlist,則將關(guān)閉用Open語句打開的所有活動文件。注意:在執(zhí)行Close語句時,文件與其文件號之間的關(guān)聯(lián)將終結(jié)。例如:用Close語句關(guān)閉所有為Output而打開的文件(3個)。
DimiAsInteger,F(xiàn)ileNameAsString
Fori=1To3 '循環(huán)3次
FileName="TEST"&i '創(chuàng)建文件名
OpenFileNameForOutputAs#1 '打開文件
Print#i,"Thisisatest."'將字符串寫入文件
Nexti
Close '將3個已打開的文件全部關(guān)閉
3.程序?qū)崿F(xiàn)
1)界面設(shè)計與屬性設(shè)置具體操作步驟如下:
(1)新建工程,添加一個窗體。
(2)在窗體中添加控件,包括一個文本框和3個命令按鈕。
(3)按表10.4所示設(shè)置窗體及控件屬性。設(shè)計好的程序界面如圖10.1所示。表10.4窗體及控件屬性
2)編寫代碼其代碼編寫如下:
PrivateSubCommand1_Click()'讀取文件
DimFile1AsString,nextlineAsString
File1="D:\text.txt"
Text1.Text=""
OpenFile1ForInputAs#1'按讀方式打開
DoUntilEOF(1)
'將打開文本文件的內(nèi)容賦予文本框
LineInput#1,nextline
Text1.Text=Text1.Text+nextline+Chr(13)+Chr(10)
Loop
Close#1
'關(guān)閉打開的文件
EndSub
PrivateSubCommand2_Click()
'將文本框的內(nèi)容寫入文件
DimcontentsAsString
Open"D:\text.txt"ForOutputAs#1'以寫方式打開文件
contents=Text1.Text
Text1.Text=“”
'清除文本框中的內(nèi)容
Print#1,contents'往文件中寫入內(nèi)容
Close#1
EndSub
PrivateSubCommand3_Click()
UnloadMe '退出程序
EndSub
3)運行程序單擊“讀出”命令按鈕,程序打開順序文件“D:\text.txt”,并將內(nèi)容賦予文本框。在文本框中對文件進行編輯修改,將“如果要編輯一個文件”改為“如果要編輯一個順序文件”,然后單擊“寫入”命令按鈕,將修改的內(nèi)容保存回該文件,文本框中清空。再次打開順序文件“D:\text.txt”,顯示修改成功,如圖10.2所示。圖10.2順序文件使用示例10.2隨機文件在文件操作中以順序文件方式存取數(shù)據(jù)十分方便,也很常用,但是當需要大量查找或修改文件中的數(shù)據(jù)時會很困難,而這時采用隨機文件方式存取數(shù)據(jù)就顯得比較方便。隨機文件的每一個數(shù)據(jù)項都有相同的長度,它的數(shù)據(jù)項通常稱作記錄。隨機文件是以記錄為單位的,每條記錄都被賦予了記錄號以便查找。應(yīng)用程序可以根據(jù)記錄號直接讀取隨機文件中的任意記錄,而無須由前至后逐個讀取。案例2隨機文件的使用
1.學(xué)習(xí)目標設(shè)計一個演示隨機文件讀寫操作的程序,程序運行界面如圖10.3所示,要求該程序可以打開一個隨機文件“D:\text.txt”,并可以從隨機文件中讀出記錄,也可以往隨機文件中添加記錄。圖10.3隨機文件程序設(shè)計界面
2.相關(guān)知識
1)聲明記錄類型變量對隨機文件的存取是以記錄為單位進行的。記錄是存儲一組相互聯(lián)系數(shù)據(jù)的一種數(shù)據(jù)結(jié)構(gòu),記錄中的成分稱作分量。每個記錄包括一個或多個分量。具有一個分量的記錄對應(yīng)于任一標準類型,比如整數(shù)或定長字符串。具有多個分量的記錄對應(yīng)于用戶自定義類型。例如,當我們要登記學(xué)生信息時需要登記學(xué)生的姓名、年齡、性別等,此時以記錄方式保存學(xué)生信息既簡潔又直觀。在打開一個文件進行隨機訪問之前,應(yīng)定義一個類型,該類型對應(yīng)于該文件包含或?qū)挠涗?。使用VisualBasic提供的自定義類型可以定義記錄,其語法格式為:
[Private?|?Public]Type自定義類型名分量名Astype
[分量名Astype]
…
EndType例如:聲明一個學(xué)生自定義類型。
TypeStudent
NameAsString
8 '姓名
AgeAs Integer'年齡
SexAsString
2 '性別
EndType由于隨機文件中的所有記錄都必須有相同的長度,因此在上面的用戶自定義類型中,字符串類型的字段要使用固定的長度。若類型中的元素有數(shù)組類型,也必須將它定義為定長數(shù)組。如果實際字符串包含的字符數(shù)比類型定義中的字符少,則自動用空白字符來填充記錄中后面的空間;如果字符串的長度超過定義的長度,則將截去多余字符。如要編輯隨機訪問的文件,需要先打開該文件,再把記錄從文件讀到程序變量,然后改變各變量的值,最后把變量寫回文件。
2)打開隨機文件在使用隨機文件之前,應(yīng)先用Open語句打開它。Open語句的語法格式為:
OpenpathnameForRandomAsfilenumberLen=reclength其中各參數(shù)的含義如下:●??ForRandom:可選項。如果未指定打開文件的方式,則以Random訪問方式打開文件。對隨機文件進行打開操作時,讀或?qū)懩J蕉枷嗤?,無須指明輸入、輸出或追加模式。因為隨機文件按記錄操作,無論讀或?qū)懚疾挥绊懳募衅渌麅?nèi)容,只要打開一次隨機文件就可同時進行讀或?qū)懖僮??!??Len=reclength:該表達式指定了每條記錄的大小。如果reclength設(shè)置的值比寫入文件中的記錄的實際長度短,則會產(chǎn)生一個錯誤;如果reclength設(shè)置的值比記錄的實際長度長,則記錄可以寫入,但是會浪費一些磁盤空間。例如:
DimLastrecordAsLong'存放最后一條記錄的編號
Dimstudent1Asstudent
DimRecLengthasLong
RecLength=Len(student1)'計算每條記錄的長度
FileNum=FreeFile()
'取出下一個可用文件編號
Open“School.dat”ForRandomAsFileNum
Len=
RecLength'用Open語句打開新文件
LastRecord=LOF(FileNum)/RecLength'存放文件中記錄的個數(shù)
3)隨機文件的讀操作使用Get語句可以從隨機文件中讀出指定的記錄,其語法格式為:
Get[#]filenumber,[recnumber],varname其中,可選參數(shù)recnumber在隨機文件中表示記錄號,以表示從此處開始讀出數(shù)據(jù)。隨機文件中第一條記錄的記錄號為1,第二條記錄為2,依此類推。若省略recnumber,則會讀出緊隨上一個Get或Put語句之后的下一條記錄(或讀出最后一條Seek函數(shù)指出的記錄)。例如:用Get語句將數(shù)據(jù)從隨機文件讀到變量中。
DimStudent1AsStudent,PositionAsLong '聲明變量
Open"School.dat"ForRandomAs#1Len=Len(Student1)'為隨機訪問打開樣本文件
Position=4
'定義記錄號
Get#1,Position,Student1'讀樣本文件第4條記錄到變量Student1中
Close#1
'關(guān)閉文件把記錄讀取到變量后,就可以對記錄進行處理。例如:用下面的語句將記錄的各個字段分別送到文本框中,以便用戶進行編輯。
text1.text=Student1.Number
text2.text=Student1.Name
text3.text=Student1.Score
4)隨機文件的寫操作使用Put語句可以把數(shù)據(jù)重新寫入磁盤文件中,也可以往隨機文件中添加新的記錄。Put語句的語法格式為:
Put[#]filenumber,[recnumber],varname其中各參數(shù)的含義與Get語句的相同。使用Put語句可以完成以下操作:
(1)替換記錄。用Put語句替換記錄,只需指明要被替換記錄的位置即可。例如,要將上面編輯后的結(jié)果寫入文件,以替換原來的記錄內(nèi)容,可用如下語句:
Student1.Number=text1.text
Student1.Name=text2.text
Student1.Score=text3.text
Put#1,Position,Student1'Position指明被替換記錄的位置
(2)添加記錄。使用Put語句可以向打開的隨機文件的末端添加記錄,只需把命令參數(shù)recnumber變量的值設(shè)置為比文件中的記錄數(shù)多1即可。
(3)刪除記錄。通過清除記錄分量可以刪除一條記錄,但是該記錄仍在文件中存在。通常文件中不能有空記錄,因為它們會浪費空間且會干擾順序操作。最好把余下的記錄拷貝到一個新文件中,然后刪除原文件。清除隨機訪問文件中要刪除的記錄的操作步驟如下:①創(chuàng)建一個新文件;②把有用的所有記錄從原文件復(fù)制到新文件;③關(guān)閉原文件并用Kill語句刪除它;④使用Name語句把新文件以原文件的名字重新命名。
3.程序?qū)崿F(xiàn)
1)界面設(shè)計與屬性設(shè)置具體操作步驟如下:
(1)新建工程,添加一個窗體。
(2)在窗體中添加控件,包括3個文本框、3個命令按鈕和3個標簽。
(3)按表10.5所示設(shè)置窗體及控件屬性。設(shè)計好的程序界面如圖10.3所示。表10.5窗體及控件屬性
2)編寫代碼其代碼編寫如下:
PrivateTypeStudent
NameAsString*8
AgeAsInteger
SexAsString*2
EndType
PrivateSubCommand1_Click() '讀取隨機文件
DimstdAsStudent
DimRecordeLenAsInteger,recordeNumAsInteger
Text1.Text=""
Text2.Text=""
Text3.Text=""
RecordeLen=Len(std)
recordeNum=3
Open"D:\text.dat"ForRandomAs#1Len=RecordeLen
Get#1,recordeNum,std
Text1.Text=std.Name
Text2.Text=Str(std.Age)
Text3.Text=std.Sex
recordeNum=recordeNum-1
Get#1,recordeNum,std
Text1.Text=Text1.Text+Chr(13)+Chr(10)+std.Name
Text2.Text=Text2.Text+Chr(13)+Chr(10)+Str(std.Age)
Text3.Text=Text3.Text+Chr(13)+Chr(10)+std.Sex
recordeNum=recordeNum-1
Get#1,recordeNum,std
Text1.Text=Text1.Text+Chr(13)+Chr(10)+std.Name
Text2.Text=Text2.Text+Chr(13)+Chr(10)+Str(std.Age)
Text3.Text=Text3.Text+Chr(13)+Chr(10)+std.Sex
Close#1
EndSub
PrivateSubCommand2_Click()'將記錄寫入隨機文件
DimRecordeLenAsInteger,recordeNumAsInteger
DimZhangSanAsStudent
DimLiSiAsStudent
DimWangWuAsStudent
ZhangSan.Name="張三"
ZhangSan.Age=19
ZhangSan.Sex="男"
LiSi.Name="李四"
LiSi.Age=20
LiSi.Sex="男"
WangWu.Name="王五"
WangWu.Age=18
WangWu.Sex="女"
RecordeLen=Len(ZhangSan)
recordeNum=1
Open"D:\text.dat"ForRandomAs#1Len=RecordeLen
Put#1,recordeNum,ZhangSan
recordeNum=recordeNum+1
Put#1,recordeNum,LiSi
Put#1,,WangWu
Close#1
EndSub
PrivateSubCommand3_Click()'退出程序
UnloadMe
EndSub
3)運行程序單擊“寫入”命令按鈕,程序在D:\text.dat文件中寫入三條記錄。單擊“讀出”命令按鈕,剛剛寫入文件的學(xué)生記錄被讀出,顯示在三個文本框的第一行上,然后讀取第二條記錄,將學(xué)生數(shù)據(jù)顯示在三個文本框的第二行上,最后讀取第一條記錄,將學(xué)生數(shù)據(jù)顯示在三個文本框的第三行上,如圖10.4所示。圖10.4隨機文件使用示例10.3二?進?制?文?件二進制文件是一個字節(jié)流,文件系統(tǒng)并不解釋各字節(jié)的意義,解釋工作由具體的應(yīng)用程序完成。二進制文件每一次讀寫是以字節(jié)為單位對數(shù)據(jù)進行訪問操作的,它允許用戶讀寫或修改文件中的任何字節(jié)信息。當要保持文件的尺寸盡量小時,應(yīng)使用二進制文件。以二進制方式訪問文件有下述特點:●可以直接訪問文件中的所有數(shù)據(jù);●由應(yīng)用程序根據(jù)需要解釋數(shù)據(jù)的意義;●訪問文件的語句不更改原始數(shù)據(jù)的所有內(nèi)容。當把二進制數(shù)據(jù)寫入文件中時,應(yīng)使用Byte數(shù)據(jù)類型的數(shù)組,而不能用String變量,因為String變量被認為包含的是字符,而二進制型數(shù)據(jù)可能無法正確地存儲在String變量中。訪問二進制文件時,首先要打開文件,然后讀取數(shù)據(jù),最后關(guān)閉打開的文件。
1.二進制文件的打開在VB中,使用Open語句打開二進制文件。其語法格式為:
OpenpathnameforBinaryAsfilenumber例如:打開二進制文件D:\text.dat。
Open"D:\text.dat"ForBinaryAs1二進制文件在打開時不需指明讀寫方式,只要打開一次便可用讀寫語句進行任意讀寫操作。
2.二進制文件的讀寫二進制文件的讀寫與隨機文件的類似,都可用Get和Put語句。其語法格式為:
Get[#]filenumber,[recnumber],varname
Put[#]filenumber,[recnumber],varname其中各參數(shù)的含義如下:●?recnumber:表示開始讀取數(shù)據(jù)字節(jié)的位置,文件中第一個字節(jié)位置為1,第二個字節(jié)位置為2,依此類推。如果省略此參數(shù),則表示從當前位置的下一個字節(jié)開始讀數(shù)據(jù)。當省略該參數(shù)時,參數(shù)前后的逗號不能省略?!?varname:varname的類型決定從文件中讀取多少個字節(jié)的數(shù)據(jù),即變量在程序中進行聲明時為其分配了內(nèi)存空間,一次讀取數(shù)據(jù)的字節(jié)數(shù)與變量在內(nèi)存中所占字節(jié)數(shù)相同。所以,程序中定義變量的長度可決定每次從文件讀取數(shù)據(jù)的字節(jié)數(shù)。例如:從二進制文件D:\text.dat中讀取兩個字節(jié)的數(shù)據(jù)信息。
DimdataAsInteger
Get#1,data二進制文件可以使用可變長字段,所以不能隨機地訪問記錄,而必須順序地訪問記錄以了解每一條記錄的長度,這是進行二進制讀寫操作的主要缺點。但是在這種文件模式下,可以直接查看文件中指定的字節(jié),所以,二進制模式也是唯一支持用戶到文件任何位置讀寫任意長度數(shù)據(jù)的方法。
3.設(shè)置數(shù)據(jù)指針位置在隨機文件和二進制文件中,除了可通過記錄號和字節(jié)位置來確定需要訪問的數(shù)據(jù)外,還可以通過Seek語句設(shè)置在打開文件中下一次進行讀或?qū)懖僮鞯奈恢?。Seek語句的語法格式為:
Seek[#]filenumber,position其中,參數(shù)position為必選項,是介于1~2147483647之間的數(shù)字,指出下一個讀寫操作將要發(fā)生的位置??捎迷撜Z句設(shè)定好數(shù)據(jù)指針位置,然后再對文件進行讀寫操作。為了同時利用隨機文件和二進制文件的優(yōu)點,一般采用下述方法:當字段長度固定或變化不大時,使用隨機文件模式;對于長度變化很大的字段,使用二進制文件模式。在Binary、Input和Random方式下,可以用不同的文件號打開同一文件,而不必先將該文件關(guān)閉。在Append和Output方式下,如果要用不同的文件號打開同一文件,則必須在打開文件之前先關(guān)閉該文件。10.4與文件系統(tǒng)相關(guān)的控件在設(shè)計應(yīng)用程序時,常常需要用戶選擇驅(qū)動器、目錄、文件,VisualBasic為用戶查找文件提供了兩種途徑:一種是利用通用對話框(CommonDialog)控件提供的標準對話框,該對話框中列出了驅(qū)動器、目錄和文件;另一種是利用文件系統(tǒng)控件組合創(chuàng)建自己的對話框。VisualBasic提供三種文件系統(tǒng)控件:驅(qū)動器列表框(DriveListBox)、目錄列表框(DirListBox)和文件列表框(FileListBox)。這三種控件一般同時出現(xiàn)在一個界面上,用于和用戶交互管理文件系統(tǒng),但三者在界面設(shè)計階段僅顯示當前驅(qū)動器下的目錄結(jié)構(gòu)及當前目錄下的文件結(jié)構(gòu),且三者之間無任何聯(lián)系,所以在程序設(shè)計時必須通過代碼將三者有機地聯(lián)系起來。驅(qū)動器列表框、目錄列表框和文件列表框三種控件能夠自動地從操作系統(tǒng)中獲取一切信息,且操作比CommonDialog控件更靈活、功能更強大。但如果只需要標準的“打開文件”或“保存”文件對話框,則使用CommonDialog控件就可以滿足要求。案例3驅(qū)動器列表框、目錄列表框、文件列表框控件的應(yīng)用
1.學(xué)習(xí)目標設(shè)計一個文件系統(tǒng)控件的演示程序,要求運行該程序時,在文本框中輸入某種類型的文件(如
.exe),則在文件列表框中顯示出同一類型的文件。若改變驅(qū)動器列表框或目錄列表框的信息,則文件列表框中顯示的文件也要發(fā)生變化,但顯示文件的類型不發(fā)生變化,程序運行界面如圖10.5所示。圖10.5驅(qū)動器列表框、目錄列表框、文件列表框的使用示例
2.相關(guān)知識
1)驅(qū)動器列表框驅(qū)動器列表框(DriveListBox)控件是下拉式列表框,用來顯示用戶系統(tǒng)中所有有效磁盤驅(qū)動器的列表。在設(shè)計時驅(qū)動器列表框控件已將計算機內(nèi)所有有效驅(qū)動器名全部列入下拉列表框中,運行程序時,用戶可以直接輸入有效的驅(qū)動器標識符,或者單擊列表框的下拉箭頭,從列舉出的驅(qū)動器名稱中進行選擇。默認情況下,它顯示用戶系統(tǒng)的當前驅(qū)動器,如圖10.6所示。圖10.6驅(qū)動器列表框驅(qū)動器列表框的Drive屬性主要用于在運行時返回或設(shè)置所選定的驅(qū)動器。Drive屬性不能在設(shè)計狀態(tài)時設(shè)置,只能在程序中被引用或設(shè)置,其形式如下:
[對象.]Drive[=drive]其中,對象為驅(qū)動器列表框名稱;Drive為驅(qū)動器名稱。每次重新設(shè)置Drive屬性都會引發(fā)該控件的Change事件。例如:語句Drive1.Drive="d:\"?可將列表框頂端的驅(qū)動器更改為“d:\”。
2)目錄列表框目錄列表框(DirListBox)控件顯示當前驅(qū)動器的目錄結(jié)構(gòu)及當前目錄下的所有子目錄,供用戶選擇其中的某個目錄作為當前目錄。在目錄列表框中,如果雙擊某個目錄,就會顯示出該目錄下的所有子目錄。例如,在執(zhí)行時雙擊C:?根目錄就會顯示出C:?根目錄下的所有子目錄,若要查看WINNT子目錄結(jié)構(gòu),只需雙擊WINNT子目錄即可,結(jié)果如圖10.7所示。圖10.7目錄列表框目錄列表框只能顯示出當前驅(qū)動器下的子目錄。如果要顯示其他驅(qū)動器下的目錄結(jié)構(gòu),則必須重新設(shè)置目錄列表框上的Path屬性。目錄列表框的Path屬性用來返回或設(shè)置當前路徑,它適用于目錄列表框和文件列表框,不能在設(shè)計狀態(tài)下設(shè)置。其形式如下:
[對象.]Path[=pathname]其中,對象指目錄列表框或文件列表框;pathname是一個路徑名字符串。每次重新設(shè)置Path屬性都會引發(fā)目錄列表框控件的Change事件。如果窗體上同時建立了驅(qū)動器列表框和目錄列表框,則在drvDrive_Change事件過程中加入語句drvDirectory.Path
=drvDrive.Drive就可以產(chǎn)生同步效果,即在驅(qū)動器列表框中改變驅(qū)動器的內(nèi)容,則目錄列表框中的內(nèi)容立即同步改變。因為,當在驅(qū)動器列表框drvDrive中改變了驅(qū)動器時,drvDrive.Drive屬性改變了,觸發(fā)了drvDrive_Change事件,執(zhí)行drvDirectory.Path=drvDrive.Drive語句,改變drvDirectory.Path屬性就意味著目錄列表框drvDirectory的內(nèi)容改變了,從而立即顯示剛剛被選定的驅(qū)動器的目錄結(jié)構(gòu)。
3)文件列表框文件列表框(FileListBox)控件是用來顯示當前驅(qū)動器中當前目錄下的文件目錄清單的一種列表框。文件列表框也有Path屬性,表示列表框中顯示的文件所在的路徑。每次重新設(shè)置文件列表框的Path屬性都會引發(fā)PathChange事件。文件列表框的Pattern屬性用于返回或設(shè)置文件列表框所顯示的文件類型。該屬性值為具有通配符的文件名字符串,缺省值為“
.
”,表示可顯示所有文件。此屬性既可以在設(shè)計時設(shè)置,也可以在程序中改變。其形式如下:
[對象.]Pattern[=value]其中,對象指文件列表框名稱;value是一個文件名字符串。每次重新設(shè)置Pattern屬性都會引發(fā)該控件的PatternChange事件。例如:如果執(zhí)行了語句
filFile.Pattern="
.exe"則filFile文件列表框中只顯示?.exe文件,如圖10.8所示。圖10.8文件列表框
3.程序?qū)崿F(xiàn)
1)界面設(shè)計與屬性設(shè)置具體操作步驟如下:
(1)新建工程,添加一個窗體。
(2)在窗體中添加控件,包括4個標簽、1個文本框、2個命令按鈕,驅(qū)動器列表框、目錄列表框和文件列表框各1個。
(3)按表10.6所示設(shè)置窗體及控件屬性。設(shè)計好的程序界面如圖10.5所示。表10.6窗體及控件屬性
2)編寫代碼編寫事件代碼如下:
PrivateSubCommand1_Click()
File1.FileName=Text1.Text
EndSub
PrivateSubCommand2_Click()
UnloadMe
EndSub
PrivateSubDrive1_Change()'使目錄列表框中的路徑與驅(qū)動器列表同步變化
Dir1.Path=Drive1.Drive
MsgBox"選中的驅(qū)動器是"+Drive1.Drive
EndSub
PrivateSubDir1_Change()
File1.Path=Dir1.Path '設(shè)置文件列表框路徑
MsgBox"選中的文件夾是"+Dir1.Path
EndSub
PrivateSubFile1_Click()
MsgBox"選中的文件是"+File1.FileName
EndSub
PrivateSubFile1_PatternChange()
Text1.Text=File1.Pattern'將文件類型設(shè)置為新模式
EndSub
3)運行程序運行程序,在文本框中輸入“
.exe”,則執(zhí)行結(jié)果如圖10.5所示。案例4通用對話框控件的應(yīng)用
1.學(xué)習(xí)目標設(shè)計一個通用對話框操作的演示程序,要求將“打開”、“打印”、“另存為”三個通用對話框調(diào)入窗體,設(shè)置三個命令按鈕用于調(diào)用三種對話框,其窗體布局如圖10.9所示。運行程序后,能正確調(diào)用三個通用對話框。圖10.9通用對話框操作示例
2.相關(guān)知識通用對話框(CommonDialog)控件常用于提供要讀的文件名或要寫的文件名。通用對話框共有六種,即Open(打開)、SaveAs(保存文件)、Print(打印)、Color(顏色)、Font(字體)、Help(幫助)。通過設(shè)置通用對話框控件的屬性和使用它的不同方法,可以打開文件、保存文件以及顯示“顏色”對話框、“字體”對話框和“打印”對話框。
1)創(chuàng)建通用對話框控件通用對話框(CommonDialog)控件是一個ActiveX控件,使用前,應(yīng)該先將它們添加到工具箱中。具體方法如下:
(1)選擇“工程”菜單項中的“部件”選項,或在工具箱中單擊鼠標右鍵,在彈出的快捷菜單中選擇“部件”選項,調(diào)出“部件”對話框,如圖10.10所示。
(2)在“控件”選項卡中列出了可以添加的ActiveX控件,選擇所需的“Microsoft
CommonDialogControl6.0”列表項,單擊該控件名稱左邊的復(fù)選框。
(3)單擊“確定”命令按鈕,關(guān)閉“部件”對話框,被選中的通用對話框控件被添加到當前工程的工具箱中,圖標為,缺省名為CommonDialogX(X為1,2,…)。圖10.10“部件”對話框
2)通用對話框控件的屬性在調(diào)用通用對話框的方法之前,應(yīng)該根據(jù)需要設(shè)置該控件的屬性。與其他控件相似,設(shè)置通用對話框?qū)傩缘姆椒ㄒ灿袃煞N,一種是在屬性窗口中設(shè)置,另一種是使用代碼設(shè)置。在屬性窗口中設(shè)置通用對話框?qū)傩缘姆椒ㄈ缦拢?/p>
(1)右擊窗體上的通用對話框控件,再單擊彈出菜單中的“屬性”菜單項,系統(tǒng)顯示如圖10.11所示的“屬性頁”對話框。圖10.11“屬性頁”對話框
(2)當需要使用“打開”對話框或“另存為”對話框時,在“打開/另存為”選項卡中設(shè)置通用對話框的屬性。下面簡單介紹一下常用的“打開/另存為”選項卡中常用選項的意義,其他選項卡選項的意義可參考VB6.0的MSDN幫助?!駥υ捒驑祟}:對應(yīng)于通用對話框的DialogTitle屬性,指定“打開”對話框或“另存為”對話框的標題。缺省時,這兩個對話框的標題分別為“打開”和“另存為”?!裎募Q:對應(yīng)于通用對話框的FileName屬性,指定通用對話框中缺省選中的文件的名稱,同時也指明了通用對話框缺省顯示的驅(qū)動器和目錄名。不指定該選項時,“打開”對話框或“另存為”對話框自動顯示當前驅(qū)動器上當前目錄下的文件。●初始化路徑:對應(yīng)于通用對話框的InitDir屬性,指定“打開”或“另存為”對話框的初始目錄。如果此屬性沒有指定,則通用對話框使用當前目錄?!襁^濾器:對應(yīng)于通用對話框的Filter屬性,指定對話框中都顯示哪些文件。例如,選擇過濾器為*.txt時,對話框中顯示所有的文本文件。過濾器的格式為:
description1|filter1|description2|filter2…其中,description1、description2是過濾器的文本描述;filter1、filter2是過濾器的定義?!駱酥荆簩?yīng)于通用對話框的Flags屬性,指定“打開”或“另存為”對話框的形式以及文件選擇方式(單項選擇還是多項選擇)。
3)通用對話框控件的方法通用對話框有如下6個常用的方法:
(1)?ShowOpen方法:用于調(diào)用“打開”對話框;
(2)?ShowSave方法:用于調(diào)用“另存為”對話框;
(3)?ShowPrinter方法:用于調(diào)用“打印”對話框;
(4)?ShowColor方法:用于調(diào)用“顏色”對話框;
(5)?ShowFont方法:用于調(diào)用“字體”對話框;
(6)?ShowHelp方法:用于調(diào)用“幫助”對話框。
3.程序?qū)崿F(xiàn)
1)界面設(shè)計與屬性設(shè)置具體操作步驟如下:
(1)新建工程,添加一個窗體。
(2)在窗體中添加控件,包括3個通用對話框和3個命令按鈕。
(3)設(shè)置通用對話框控件的屬性。在第1個通用對話框控件中,將“打開/另存為”選項卡中的對話框標題指定為“打開”,過濾器的格式設(shè)置為“所有文件(*.*)?|?*.*?|?文本
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024學(xué)校實驗室設(shè)備更新及維修服務(wù)合同3篇
- 2024店鋪轉(zhuǎn)讓協(xié)議書
- 2024模具智能制造技術(shù)研發(fā)合同
- 2024標準版兩居室房車短期租賃合同版
- 2024服裝工裝定制合同
- 2024青島運動會官方用車租賃服務(wù)協(xié)議3篇
- 2024年行車設(shè)備安裝與維護合同3篇
- 2024年版城市供水項目特許經(jīng)營權(quán)協(xié)議
- 2024運營總監(jiān)國際業(yè)務(wù)拓展與跨國合作合同3篇
- 2025年度網(wǎng)絡(luò)安全技術(shù)股權(quán)合作與轉(zhuǎn)讓合同3篇
- 肝斷面引流管護理
- 醫(yī)療器械銷售合同模板
- GB/T 44713-2024節(jié)地生態(tài)安葬服務(wù)指南
- 2024年形勢與政策 第一講《讀懂中國式現(xiàn)代化》
- 2024-2025學(xué)年蘇教版四年級上冊期末自主測試數(shù)學(xué)試卷(一)(含答案解析)
- 光伏發(fā)電系統(tǒng)數(shù)據(jù)采集規(guī)范指南
- 110kV電力變壓器參數(shù)表
- 2024年天津三源電力集團限公司社會招聘33人高頻難、易錯點500題模擬試題附帶答案詳解
- 校(園)廉政風(fēng)險防控預(yù)警處置制度
- TB 10106-2023鐵路工程地基處理技術(shù)規(guī)程
- 三年級下冊綜合實踐活動教學(xué)設(shè)計- 嶺南水果|粵教版 52張
評論
0/150
提交評論