C 標準庫 IO 操作

2021-05-21 23:48:54 字數 3880 閱讀 1817

c++ 通過以下幾個類支援檔案的輸入輸出:

開啟檔案(open a file)

對這些類的乙個物件所做的第乙個操作通常就是將它和乙個真正的檔案聯絡起來,也就是說開啟乙個檔案。被開啟的檔案在程式中由乙個流物件(stream object)來表示 (這些類的乙個例項) ,而對這個流物件所做的任何輸入輸出操作實際就是對該檔案所做的操作。

要通過乙個流物件開啟乙個檔案,我們使用它的成員函式open():

void open (const char * filename, openmode mode);

這裡filename 是乙個字串,代表要開啟的檔名,mode 是以下標誌符的乙個組合:

ios::in

為輸入(讀)而開啟檔案

ios::out

為輸出(寫)而開啟檔案

ios::ate

初始位置:檔案尾

所有輸出附加在檔案末尾

ios::trunc

如果檔案已存在則先刪除該檔案

ios::binary

二進位制方式

這些識別符號可以被組合使用,中間以」或」操作符(|)間隔。例如,如果我們想要以二進位制方式開啟檔案"example.bin" 來寫入一些資料,我們可以通過以下方式呼叫成員函式open()來實現:

ofstream file;

ofstream, ifstream 和 fstream所有這些類的成員函式open 都包含了乙個預設開啟檔案的方式,這三個類的預設方式各不相同:

類引數的預設方式

ofstream

ios::out | ios::trunc

ifstream

ios::in

fstream

ios::in | ios::out

只有當函式被呼叫時沒有宣告方式引數的情況下,預設值才會被採用。如果函式被呼叫時宣告了任何引數,預設值將被完全改寫,而不會與呼叫引數組合。

由於對類ofstream, ifstream 和 fstream 的物件所進行的第乙個操作通常都是開啟檔案,這些類都有乙個建構函式可以直接呼叫open 函式,並擁有同樣的引數。這樣,我們就可以通過以下方式進行與上面同樣的定義物件和開啟檔案的操作:

兩種開啟檔案的方式都是正確的。

你可以通過呼叫成員函式is_open()來檢查乙個檔案是否已經被順利的開啟了:

bool is_open();

它返回乙個布林(bool)值,為真(true)代表檔案已經被順利開啟,假( false )則相反。

關閉檔案(closing a file)

當檔案讀寫操作完成之後,我們必須將檔案關閉以使檔案重新變為可訪問的。關閉檔案需要呼叫成員函式close(),它負責將快取中的資料排放出來並關閉檔案。它的格式很簡單:

void close ();

這個函式一旦被呼叫,原先的流物件(stream object)就可以被用來開啟其它的檔案了,這個檔案也就可以重新被其它的程序(process)所有訪問了。

為防止流物件被銷毀時還聯絡著開啟的檔案,析構函式(destructor)將會自動呼叫關閉函式close。

文字檔案(text mode files)

類ofstream, ifstream 和fstream 是分別從ostream, istream 和iostream 中引申而來的。這就是為什麼 fstream 的物件可以使用其父類的成員來訪問資料。

一般來說,我們將使用這些類與同控制台(console)互動同樣的成員函式(cin 和 cout)來進行輸入輸出。如下面的例題所示,我們使用過載的插入操作符<<:

// writing on a text file

#include

int main ()

return 0;

}file example.txt this is a line.

this is another line.

從檔案中讀入資料也可以用與 cin的使用同樣的方法:

// reading a text file

#include

#include

#include

int main ()

while (! examplefile.eof() )

return 0;

}this is a line. this is another line.

上面的例子讀入乙個文字檔案的內容,然後將它列印到螢幕上。注意我們使用了乙個新的成員函式叫做eof ,它是ifstream 從類 ios 中繼承過來的,當到達檔案末尾時返回true 。

狀態標誌符的驗證(verification of state flags)

除了eof()以外,還有一些驗證流的狀態的成員函式(所有都返回bool型返回值):

要想重置以上成員函式所檢查的狀態標誌,你可以使用成員函式clear(),沒有引數。

獲得和設定流指標(get and put stream pointers)

所有輸入/輸出流物件(i/o streams objects)都有至少乙個流指標:

我們可以通過使用以下成員函式來讀出或配置這些指向流中讀寫位置的流指標:

流指標 get 和 put 的值對文字檔案(text file)和二進位制檔案(binary file)的計算方法都是不同的,因為文字模式的檔案中某些特殊字元可能被修改。由於這個原因,建議對以文字檔案模式開啟的檔案總是使用seekg 和 seekp的第一種原型,而且不要對tellg 或 tellp 的返回值進行修改。對二進位制檔案,你可以任意使用這些函式,應該不會有任何意外的行為產生。

以下例子使用這些函式來獲得乙個二進位制檔案的大小:

// obtaining file size

#include

#include

const char * filename = "example.txt";

int main ()

size of example.txt is 40 bytes.

二進位制檔案(binary files)

在二進位制檔案中,使用<< 和》,以及函式(如getline)來操作符輸入和輸出資料,沒有什麼實際意義,雖然它們是符合語法的。

檔案流包括兩個為順序讀寫資料特殊設計的成員函式:write 和 read。第乙個函式 (write) 是ostream 的乙個成員函式,都是被ofstream所繼承。而read 是istream 的乙個成員函式,被ifstream 所繼承。類 fstream 的物件同時擁有這兩個函式。它們的原型是:

write ( char * buffer, streamsize size );

read ( char * buffer, streamsize size );

這裡 buffer 是一塊記憶體的位址,用來儲存或讀出資料。引數size 是乙個整數值,表示要從快取(buffer)中讀出或寫入的字元數。

// reading binary file

#include

#include

const char * filename = "example.txt";

int main ()

the complete file is in a buffer

快取和同步(buffers and synchronization)

當我們對檔案流進行操作的時候,它們與乙個streambuf 型別的快取(buffer)聯絡在一起。這個快取(buffer)實際是一塊記憶體空間,作為流(stream)和物理檔案的媒介。例如,對於乙個輸出流, 每次成員函式put (寫乙個單個字元)被呼叫,這個字元不是直接被寫入該輸出流所對應的物理檔案中的,而是首先被插入到該流的快取(buffer)中。

當快取被排放出來(flush)時,它裡面的所有資料或者被寫入物理媒質中(如果是乙個輸出流的話),或者簡單的被抹掉(如果是乙個輸入流的話)。這個過程稱為同步(synchronization),它會在以下任一情況下發生:

標準C庫的檔案io操作介面

先讓我們來一起數一下常見的檔案io操作有哪些吧 fopen 開啟檔案 fclose 關閉檔案 fread 從檔案中讀取 fwrite 向檔案中寫入 fprintf 格式化標準寫入 fseek 移動跳轉指定讀取或者寫入位置 開啟 file fopen const char path,const cha...

C語言檔案IO操作(標準IO)

函式 file fopen const char path,const char mode 引數1 將要開啟的檔案路徑 引數2 開啟檔案的方式 1.r 唯讀的方式開啟 2.w 若檔案不存在則建立檔案,若存在此檔案則清空檔案內容並打卡 3.a 若檔案不存在則建立檔案,若存在則在末尾追加 不會清空原檔案...

c標準IO庫使用

雖說大部分場合能用c的都可以用c 代替,但是對於開發庫,還是用c效率高。下面介紹c標準io庫 檔案操作標準i o庫函式 fopen fread fwrite fclose fflush fseek fgetc getc getchar fputc putc putchar fgets gets pr...