此種方式是以行為單位進行讀取的基本單位,主要應用的方法和函式有open,close,line input,freefile,eof等。下面先簡述其功能然後結合**示例進行說明。
open:顧名思義,它的作用是開啟檔案,換而言之開啟某個檔案就是獲得某個的控制權,一般情況下當檔案處於開啟狀態時只有開啟者才能對它進行操作。開啟檔案時要指定乙個整數作為檔案號,以後的操作都是針對這個代號進行的,而不是針對檔名。檔案號也叫控制代碼,在程式中乙個檔案號只能指向乙個檔案,不能出現兩個檔案同時具有相同控制代碼的情況。
close:關閉檔案,即釋放檔案的控制權。
line input:以行為單位取得檔案內容,以行為單位是指從當前位置開始到下乙個換行符為止的內容。換行符是chr(13) & chr(10)兩個位元組組成,vb中已定義了常量vbcrlf,可直接使用。要注意的是line input讀取一行時會把行尾的換行符去掉,因此我們在讀取每行內容時要記得補上換行符才能保持得到的內容與檔案一致。
freefile:得到空閒的檔案號,用這個函式取得檔案號可以避免檔案號的衝突。
例如:dim strfilename as string '檔名
dim lnghandle as long '檔案控制代碼
dim strall as string '所讀取的文字檔案的所有內容
dim strline as string '在迴圈中存放每行的內容
strfilename = "c:/b.txt"
'獲得檔案的控制代碼
lnghandle = freefile()
open strfilename for input as lnghandle
'迴圈直到檔案尾
do while not eof(lnghandle)
'每次讀取一行存放在strline變數中
line input #lnghandle, strline
'每次讀取都把所讀到的內容連線到strall變數,由於line input去掉了換行符,所以這裡補上
strall = strall & strline & vbcrlf
loop
'顯示得到的全部分內容
msgbox strall, vbinformation
**示例:
dim strfilename as string '檔名
dim lnghandle as long '控制代碼
dim strwrite as string '要寫入的文字內容
strfilename = "c:/w.txt"
lnghandle = freefile() '取得控制代碼
'準備要寫入的內容
strwrite = "落日樓頭,斷鴻聲裡,江南遊子。把吳鉤看了,欄干拍遍,無人會、登臨意。"
open strfilename for output as lnghandle '開啟檔案
print #lnghandle, strwrite '寫入文字
close lnghandle '關閉檔案
msgbox "寫入完成。", vbinformation
所有檔案的儲存其實質都是二進位制的,二進位制檔案往往由兩部分組成,一部分是檔案頭另一部分存放了檔案的內容。檔案頭通常存放與檔案格式有關的資訊,以bmp等圖象檔案為例,它們的檔案頭中存放了是何種圖形格式、圖象大小、調色盤等資訊,要顯示圖象時先讀取檔案頭以獲得檔案的詳細資訊,然後再按其格式把圖象內容顯示出來。用二進位制方式可以操作任何的檔案,當然至關重要的一點是要清楚了解所操作檔案的檔案頭結構。
vb中二進位制檔案操作主要應用的方法和函式有:open,close,get,put等。
open:在for後面的開啟模式要用binary。
close:關閉檔案。
get:在指定位置取得檔案的內容,如果省略位置則從當前位置讀取。
put:在指定位置寫入檔案,如果省略位置引數就從當前位置寫。
下面結合**講解二進位制檔案的操作。
下述程式完成了將兩個檔案結合成乙個檔案以及將這個結合後的檔案再拆分成原來的兩個檔案。檔案頭的結構是自己定義的,非常簡單,共8個位元組(也就是兩個長整型的長度),前4個位元組存放第乙個檔案的長度,後4個位元組存放第二個檔案的長度。為了更直觀地表達檔案的結構,現假設有兩個檔案,第乙個檔案長度是100位元組,第二個檔案是200位元組,那麼合併後得到的檔案應該是308位元組。按順序來看,檔案的結構是:
4第一檔案的長度
4第二檔案的長度
100第一檔案的二進位制內容
200第二檔案的二進位制內容
除了檔案頭的8位元組長度是固定的後面的長度都會因檔案的不同而變化的。
『實現檔案的合併
private sub mergefile()
dim strfilename1 as string '第乙個檔案
dim strfilename2 as string '第二個檔案
dim stroutput as string '合併後的檔案
dim arycontent() as byte '用來讀取檔案的陣列,每次讀取前要重定義
strfilename1 = "c:/a.bmp"
strfilename2 = "c:/b.bmp"
stroutput = "c:/out.bmp"
'注意下面三個open語句都是用binary模式開啟的
open stroutput for binary as #100
open strfilename1 for binary as #1
open strfilename2 for binary as #2
put #100, , lof(1) '取得第一檔案的長度,並把它寫入到合併檔案的檔案頭中
put #100, , lof(2) '取得第二檔案的長度,並寫入到合併檔案的檔案頭中
redim arycontent(lof(1) - 1) '重定義陣列,為讀取檔案做準備
get #1, , arycontent() '取得第一檔案的內容到陣列
put #100, , arycontent() '把第一檔案的內容寫到合併檔案中
redim arycontent(lof(2) - 1)
get #2, , arycontent()
put #100, , arycontent()
'關閉檔案
close #1
close #2
close #100
end sub
『實現檔案的拆分
private sub splitfile()
dim strfilename1 as string
dim strfilename2 as string
dim strfilesplit as string
dim arycontent() as byte
dim lnglof(1) as long '存放從檔案頭取得的兩個檔案的長度
strfilename1 = "c:/a2.bmp"
strfilename2 = "c:/b2.bmp"
strfilesplit = "c:/out.bmp"
open strfilesplit for binary as #100
get #100, , lnglof(0) '取得第一檔案的長度
get #100, , lnglof(1) '第二檔案的長度
open strfilename1 for binary as #1
open strfilename2 for binary as #2
redim arycontent(lnglof(0)-1) '用第一檔案的長度重定義陣列,為讀取第一檔案做準備
get #100, 9, arycontent() '從第9位元組,即檔案後面開始讀取第一檔案的內容
put #1, , arycontent() '把取得的內容寫入到拆分檔案中
redim arycontent(lnglof(1)-1)
get #100, 9 + lnglof(0) + 1, arycontent() '從第9位元組再加上第一檔案的長度處開始讀取第二檔案的內容,這裡可以清楚地看到檔案頭的作用了
put #2, , arycontent
close #1
close #2
close #100
msgbox "拆分完成。", vbinformation
文字檔案由於沒有格式所以它的讀寫都比較簡單和直觀,而用二進位制操作檔案時其實質就是對檔案頭的理解,如果不知道檔案頭的結構那就無法對檔案進行處理了,知道了檔案頭所包含的資訊後,對檔案的操作其實就是按規則進行get、put罷了。
關於基礎,不得不說
最近遇到好多問題,都與基本概念相關。忍不住,就想多說幾句。研究生面試,我出了乙個問題,乙個100khz的方波訊號,幅度大約是幾伏的數量級,想測量其有效值,用什麼儀器,怎麼測?多數學生一臉茫然,搞的我不好意思,慚愧題目是不是太難了。我急了,問學生,乙個1.5v的電池,其電壓有效值是多少?學生問我,直流...
不得不說的「跳槽」
現實中不難發現 越是高階人才,適合的機會就越少 的現象。身處金字塔中上層的人員,無論是職位還是薪水,起點都很高,這客觀上造成適合的職位機會少,職業路徑轉換成本過高等問題。我個人認為,it技術高層人士,如果要跳槽,務必要注意三宜和三忌。忌 病急亂投醫 宜 方法得當 公升遷至較高職位的人,大多都多年不找...
ios icon 不得不說的故事
圖示是ios程式包所必需的組成部分。如果你沒有提供程式所需的各種尺寸的圖示,程式上傳發布時可能會無法通過驗證。ios程式為兼顧不同的應用場景,定義了多個不同規格的圖示,並以不同的命名區分 圖示名稱 大小圓角 用途必需 icon.png 57 x 57 10px 用於程式商店和在iphone ipod...