C++中的檔案輸入/輸出(5):二進位制檔案的處理 (轉)

amyz發表於2007-11-25
C++中的檔案輸入/輸出(5):二進位制檔案的處理 (轉)[@more@]

C++中的輸入/輸出(5):namespace prefix = o ns = "urn:schemas--com::office" />

原作:Ilia Yordanov,  to:loobian@cpp-home.com">loobian@cpp-home.com

二進位制檔案的處理

雖然有規則格式(formatted)的文字(到目前為止我所討論的所有檔案形式)非常有用,但有時候你需要用到無格式(unformatted)的檔案——二進位制檔案。它們和你的可看起來一樣,而與使用<>運算子建立的檔案則大不相同。get()與put()函式則賦予你讀/寫無規則格式檔案的能力:要讀取一個位元組,你可以使用get()函式;要寫入一個位元組,則使用put()函式。你應當回想起get()——我曾經使用過它。你可能會疑惑為什麼當時我們使用它時,輸出到螢幕的檔案內容看起來是文字格式的?嗯,我猜這是因為我此前使用了<>運算子。

譯註:作者的所謂“規則格式文字(formatted text)”即我們平時所說的文字格式,而與之相對的“無格式檔案(unformatted files)”即以各類資料或可執行程式碼的非文字格式檔案。通常後者需要讀入,在二進位制層次進行解析,而前者則可以直接由預定好的<>運算子進行讀入/寫出(當然,對後者也可以透過恰當地過載<>運算子實現同樣的功能,但這已經不是本系列的討論範圍了)。

get()函式與都各帶一個引數:一個char型變數(譯註:指get()函式)或一個字元(譯註:指put()函式,當然此字元也可以以char型變數提供)。

假如你要讀/寫一整塊的資料,那麼你可以使用read()和write()函式。它們的原型如下:

istream &read(char *buf, streamsize num);

ostream &write(const char *buf, streamsize num);

對於read()函式,buf應當是一個字元陣列,由檔案讀出的資料將被儲存在這兒。對於write()函式,buf是一個字元陣列,它用以存放你要寫入檔案的資料。對於這兩個函式,num是一個數字,它指定你要從檔案中讀取/寫入的位元組數。

假如在讀取資料時,在你讀取“num”個位元組之前就已經到達了檔案的末尾,那麼你可以透過gcount()函式來了解實際所讀出的位元組數。此函式會返回最後一次進行的對無格式檔案的讀入操作所實際讀取的位元組數。

在給出示例程式碼之前,我要補充的是,如果你要以二進位制方式對檔案進行讀/寫,那麼你應當將ios::binary作為開啟加入到檔案開啟的參數列中。

現在就讓我向你展示示例程式碼,你會看到它是如何運作的。

示例1:使用get( )和put( )

#include

 

void main()

{

  fstream File("test_file.txt",ios::out | ios::in | ios::binary);

 

  char ch;

  ch='o';

 

  File.put(ch); // 將ch的內容寫入檔案

 

  File.seekg(ios::beg); // 定位至檔案首部

 

  File.get(ch); // 讀出一個字元

 

  cout << ch << endl; // 將其顯示在螢幕上

 

  File.close();

}

示例2:使用read( )和write( )

#include

#include

 

void main()

{

  fstream File("test_file.txt",ios::out | ios::in | ios::binary);

 

  char arr[13];

  strcpy(arr,"Hello World!"); //將Hello World!存入陣列

 

  File.write(arr,5); // 將前5個字元——"Hello"寫入檔案

 

  File.seekg(ios::beg); // 定位至檔案首部

 

  static char read_array[10]; // 在此我將打算讀出些資料

 

  File.read(read_array,3); // 讀出前三個字元——"Hel"

 

  cout << read_array << endl; // 將它們輸出 

 

  File.close();

}


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752019/viewspace-984461/,如需轉載,請註明出處,否則將追究法律責任。

相關文章