計算機概論:C/C++程式設計
|
第7章 檔案輸入/輸出 |
|
|
授課教師:陳慶瀚 WWW : http://www.miat.ee.isu.edu.tw/cpp E-mail : pierre@isu.edu.tw |
|
7.4二進位檔案的輸入/輸出 要存取檔案的二元(binary)資料,首先必須指定開啟模式為ios::binary,一旦檔案開啟模式為binary,則所有的資料將以二進位形式存檔,就算是空白字元,tab字元,或是換行字元,都會以字元的二進位形式存檔,整數、浮點數就分別以其資料型別所佔的位元空間來儲存二進制資料,不管資料內容是什麼都不會作字元自動轉換。 put() 和 get() 除了宣告檔案輸入/輸出物件開啟模式為ios::binary外,我們還需要一些專屬於檔案物件的函式來存取二進制資料(有時也稱為非格式化資料),兩個最基本的函式是不可或缺的: put(char) get(char) 這兩個函式提供以字元存取的方式來使用非格式化資料。其中get( )函式屬於ifstream的成員函式,功能是從二進制檔案中讀取一個字元;而put( )則屬於ofstream的成員函式,功能是將一字元寫入二進制檔案中。 下面的程式為顯示檔案內容(“ex2.txt”)到螢幕上,並且判斷是否包含文字或二進位資料. 它使用get( ) 函式. 範例程式7-7使用put( )將ASCII碼0到255所對應的所有字元寫入檔案中。由於ASCII碼只使用一半作為可見的字元,另一半則是延伸字元集並且包含一些特殊符號和控制碼。 /*----------------------------------------------------*/ // 範例程式7-7 // 使用put( )函式 // 陳慶瀚,2001 /*----------------------------------------------------*/ #include <fstream.h> void main() {
char c;
ofstream out("ex2.txt", ios::binary); //宣告一個二進制的輸出檔案物件
for(int i=0; i<256; i++)
{
c = (char) i; //將整數轉為字元
out.put(c); //使用out的成員函式將單一字元存入二進制的檔案中
}
out.close(); } 執行這個程式,隨後開啟ex2.txt,你應該看到類似下列的結果 ......!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~????????????????﹜ㄓ它夾帚型陋秣捲陷絮溢劃遞蝨螃謝藥齪圴佮迓玿旂衲欶...... 除了英數字之外,看起來還夾雜著很多的亂碼,這些都是ASCII碼中不可見字元或特殊符號。 /*----------------------------------------------------*/ // 範例程式7-8 // 使用get( )函式 // 陳慶瀚,2001 /*----------------------------------------------------*/ #include <fstream.h> void main() { char ch; ifstream in("ex2.txt",
ios::binary); // 宣告一個二進制的輸入檔案物件 while(in) //如果檔案物件指標指向檔案底端,則in傳回0,迴圈中斷 { in.get(ch); //使用in的成員函式get()讀取一個字元 cout
<< ch; } } read( ) 和 write( ) 如果我們想對大量的二進制資料進行存取,fstream提供另外兩個成員函式: istream &read(char *buf, int num); ostream &write(const char *buf, int
num); ifstream的read( )函式從檔案一次讀取num 個字元,然後用把他們放入buf中;ofstream的write( )函式則是經由buf將num個字元一次寫入到檔案中。 範例程式7-9和7-10展示如何使用read( )和write( )。 /*----------------------------------------------------*/ // 範例程式7-9 // 使用write()一次寫入一個區塊資料 // 陳慶瀚,2001 /*----------------------------------------------------*/ #include
<fstream.h> void main() { int
buf [5] = {1, 2, 3, 4, 5}; ofstream
out("test", ios::binary); if(!out)
//檔案開啟失敗 { cout << "無法開啟檔案\n"; return; } //將buf由int型別轉為char型別,再經由out的成員函式write()寫入檔案 out.write((char
*) &buf, sizeof(buf)); out.close(); } 執行這個程式,buf所含的字元資料會非常有效率的被寫入binary檔案中,如果你用文字編輯器把ex3.txt打開來看,你可能會看到如下結果: 似乎與相像中的結果不大一樣,這是因為binary檔案不適合以ASCII文字編輯器來閱覽,如果你使用範例程式7-10將檔案以binary模式開啟,再將資料讀入,就可以確認資料內容與寫入時是完全一致的。 /*----------------------------------------------------*/ // 範例程式7-10 // 使用read()將區塊資料一次讀取 // 陳慶瀚,2001 /*----------------------------------------------------*/ #include
<fstream.h> void main() { int buf[5]={0,0,0,0,0}; //將buf初值設為0 ifstream in("test", ios::binary);
//宣告檔案物件的開啟模式為binary // 以區塊字元的格式讀取,再放入buf in.read((char *) & buf, sizeof buf); for(int i=0; i<5; i++) // 將buf陣列資料顯示在螢幕 { cout
<< buf [i] << " "; } in.close(); } |
||
計算機概論:C/C++程式設計 義守大學電機系 陳慶瀚 |