對這些類的乙個物件所做的第乙個操作通常就是將它和乙個真正的檔案聯絡起來,也就是說開啟乙個檔案。被開啟的檔案在程式中由乙個流物件(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, 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 )則相反。
當檔案讀寫操作完成之後,我們必須將檔案關閉以使檔案重新變為可訪問的。關閉檔案需要呼叫成員函式close(),它負責將快取中的資料排放出來並關閉檔案。它的格式很簡單:
void close ();
這個函式一旦被呼叫,原先的流物件(stream object)就可以被用來開啟其它的檔案了,這個檔案也就可以重新被其它的程序(process)所有訪問了。
為防止流物件被銷毀時還聯絡著開啟的檔案,析構函式(destructor)將會自動呼叫關閉函式close。
類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 。
除了eof()以外,還有一些驗證流的狀態的成員函式(所有都返回bool型返回值):
要想重置以上成員函式所檢查的狀態標誌,你可以使用成員函式clear(),沒有引數。
所有輸入/輸出流物件(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.
在二進位制檔案中,使用<< 和》,以及函式(如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
當我們對檔案流進行操作的時候,它們與乙個streambuf 型別的快取(buffer)聯絡在一起。這個快取(buffer)實際是一塊記憶體空間,作為流(stream)和物理檔案的媒介。例如,對於乙個輸出流, 每次成員函式put (寫乙個單個字元)被呼叫,這個字元不是直接被寫入該輸出流所對應的物理檔案中的,而是首先被插入到該流的快取(buffer)中。
當快取被排放出來(flush)時,它裡面的所有資料或者被寫入物理媒質中(如果是乙個輸出流的話),或者簡單的被抹掉(如果是乙個輸入流的話)。這個過程稱為同步(synchronization),它會在以下任一情況下發生:
開啟**取消
來自:
C 檔案操作與C 的檔案操作
c filestream 檔案流 主要用於使用二進位制方式讀寫檔案資料,可讀取任何檔案 建立filestream物件 e 建立filestream物件 filemode 指定系統開啟檔案的方式filestream fileaccess 指定檔案的訪問方式 read唯讀,write只寫,readwri...
C 檔案操作
c 追加檔案 sw.writeline 追逐理想 sw.writeline kzlll sw.writeline net筆記 sw.flush sw.close c 拷貝檔案 string orignfile,newfile file.copy orignfile,newfile,true c 刪除...
C 檔案操作
c 檔案操作 軒軒 發表於 2006 2 18 12 40 16 在c 中,有乙個stream這個類,所有的i o都以這個 流 類為基礎的,包括我們要認識的檔案i o,stream這個類有兩個重要的運算子 1 插入器 向流輸出資料。比如說系統有乙個預設的標準輸出流 cout 一般情況下就是指的顯示器...