c 檔案操作詳解

2021-06-20 14:22:52 字數 4404 閱讀 6629

ofstream: 寫操作(輸出)的檔案類 (由ostream引申而來)

ifstream: 讀操作(輸入)的檔案類(由istream引申而來)

fstream: 可同時讀寫操作的檔案類 (由iostream引申而來)

開啟檔案(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

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

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

你可以通過呼叫成員函式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型返回值):

bad()

如果在讀寫過程中出錯,返回 true 。例如:當我們要對乙個不是開啟為寫狀態的檔案進行寫入時,或者我們要寫入的裝置沒有剩餘空間的時候。

fail()

除了與bad() 同樣的情況下會返回 true 以外,加上格式錯誤時也返回true ,例如當想要讀入乙個整數,而獲得了乙個字母的時候。

eof()

如果讀檔案到達檔案末尾,返回true。

good()

這是最通用的:如果呼叫以上任何乙個函式返回true 的話,此函式返回 false 。

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

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

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

ifstream, 類似istream, 有乙個被稱為get pointer的指標,指向下乙個將被讀取的元素。

ofstream, 類似 ostream, 有乙個指標 put pointer ,指向寫入下乙個元素的位置。

fstream, 類似 iostream, 同時繼承了get 和 put

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

tellg() 和 tellp()

這兩個成員函式不用傳入引數,返回pos_type 型別的值(根據ansi-c++ 標準) ,就是乙個整數,代表當前get 流指標的位置 (用tellg) 或 put 流指標的位置(用tellp).

seekg() 和seekp()

這對函式分別用來改變流指標get 和put的位置。兩個函式都被過載為兩種不同的原型:

seekg ( pos_type position );

seekp ( pos_type position );

使用這個原型,流指標被改變為指向從檔案開始計算的乙個絕對位置。要求傳入的引數型別與函式 tellg 和tellp 的返回值型別相同。

seekg ( off_type offset, seekdir direction );

seekp ( off_type offset, seekdir direction );

使用這個原型可以指定由引數direction決定的乙個具體的指標開始計算的乙個位移(offset)。它可以是: ios::beg 從流開始位置計算的位移

ios::cur 從流指標當前位置開始計算的位移

ios::end 從流末尾處開始計算的位移

流指標 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  

c 檔案操作詳解

c 通過以下幾個類支援檔案的輸入輸出 ofstream 寫操作 輸出 的檔案類 由ostream引申而來 ifstream 讀操作 輸入 的檔案類 由istream引申而來 fstream 可同時讀寫操作的檔案類 由iostream引申而來 開啟檔案 open a file 對這些類的乙個物件所做的...

c 檔案操作詳解

c 通過以下幾個類支援檔案的輸入輸出 ofstream 寫操作 輸出 的檔案類 由ostream引申而來 ifstream 讀操作 輸入 的檔案類 由istream引申而來 fstream 可同時讀寫操作的檔案類 由iostream引申而來 開啟檔案 open a file 對這些類的乙個物件所做的...

C 檔案操作函式詳解

c 通過以下幾個類支援檔案的輸入輸出 1 ofstream 寫操作,輸出檔案類 2 ifstream 讀操作,輸入檔案類 3 fstream 可同時讀寫的檔案類。1.open函式 開啟檔案 函式原型 void open const char filename,int mode,int access ...