C++的流類庫由幾個進行I/O操作的基礎類和幾個支持特定種類的源和目標的I/O操作的類組成。
流類庫的基礎類
ios類是isrream類和ostream類的虛基類,用來提供對流進行格式化I/O操作和錯誤處理的成員函數。用關鍵字virtual可將公共基類說明為虛基類,虛基類的定義很難處理,這就是為什么最初的C++語言沒有能支持多重繼承的原因。
ios類公有派生的istream和ostream兩個類分別提供對流進行提取操作和插入操作的成員函數,而iostream類通過組合istream類和ostream類來支持對一個流進行雙向(也就是輸入和輸出)操作,它並沒有提供新的成員函數。
C++流類庫預定義了4個流,它們是cin、cout、cerr、clog。事實上,可以將cin視為類istream的一個對象,而將cout視為類ostream的對象。
ios_base類簡介
ios_base類派生ios類,ios類又是istream類和ostream類的虛基類。
文件流
在C++里,文件操作是通過流來完成的。C++總共有輸入文件流、輸出文件流和輸入輸出文件流3種,並已將它們標准化。
要打開一個輸入文件流,需要定義一個ifstream類型的對象;要打開一個輸出文件流,需要定義一個ofstream類型的對象;如果要打開輸入輸出文件流,則要定義一個fstream類型的對象。這3種類型都定義在頭文件<fstream>里。
使用文件流
(1)打開一個相應的文件流.
(2)把這個流和相應的文件關聯起來。 因為ifstream、ofstream和fstream這3個類都具有自動打開文件的構造函數,而這個構造函數就具有open()的功能。因此,事實上可以用一條語句: ofstream myStream("myText.txt"); 來完成上述兩步。如果指定文件路徑,路徑中的“\”號必須使用轉義字符表示。
(3)操作文件流。
文件打開方式選項:
ios::in = 0x01, //供讀,文件不存在則創建(ifstream默認的打開方 式) ios::out = 0x02, //供寫,文件不存在則創 建,若文件已存在則清空原內容(ofstream默認的打開方式) ios::ate = 0x04, //文件打開時,指針在文件最后。可改變指針的位置,常和in、out聯合使用 ios::app = 0x08, //供寫,文件不存在則創建,若文件已存在則在原文件內容后寫入 新的內容,指針位置總在最后 ios::trunc = 0x10, // 在讀寫前先將文件長度截斷為0(默認) ios::nocreate = 0x20, //文件不存在時產生錯誤,常和in或app聯合使用 ios::noreplace = 0x40, //文件存在時產生錯誤,常和out聯合使用 ios::binary = 0x80 //二進制格式文件
文件保護方式
filebuf::openprot; //默認的兼容共享方式 filebuf::sh_none; //獨占,不共享 filebuf::sh_read; //讀共享 filebuf::sh_write; //寫共享
打開文件的方法
調用構造函數時指定文件名和打開模式
ifstream f("d:\\12.txt", ios::nocreate); //默認以 ios::in 的方式打開文件,文件不存在時操作失敗 ofstream f("d:\\12.txt"); //默認以 ios::out的方式打開文件 fstream f("d:\\12.dat", ios::in|ios::out|ios::binary); //以讀 寫方式打開二進制文件
使用Open成員函數
fstream f; f.open("d:\\12.txt",ios::out); //利用同一對象對多個文件進行操作時要用到open函數
檢查是否成功打開成功:
if (f) {...} //對ifstream、ofstream對象可 用,fstream對象不可用。 if (f.good()) {...}
失敗:
if (!f) {...} // !運算符已經重載 if (f.fail()) {...}
典型流成員函數
輸出流的open函數 open函數的原型如下:
void open(char const *,int filemode,int =filebuf::openprot);
它有3個參數,第一個是要打開的文件名,第2個是文件的打開方式,第3個是文件的保護方式,一般都使用默認值。第2個參數可以取如下所示的值:
ios_base::in 打開文件進行讀操作,這種方式可避免刪除現存文件的內容
ios_base::out 打開文件進行寫操作,這是默認模式
ios_base::ate 打開一個已有的輸入或輸出文件並查找到文件尾
ios_base::app 打開文件以便在文件尾部添加數據
ios_base::binary 指定文件以二進制方式打開,默認為文本方式
ios_base::trunc 如文件存在,將其長度截斷為零並清除原有內容
除ios_base::app方式之外,在其他幾種方式下,文件剛剛打開是,指示當前讀寫位置的文件指針都定位於文件的開始位置,而ios_base::app使文件當前的寫指針定位於文件尾。這幾種方式也可以通過“或”運算符“|”同時使用。
close成員函數
close成員函數用來關閉與一個文件流相關聯的磁盤文件。如果沒有關閉該文件,因為文件流是對象,所以在文件流對象的生存期結束時,將自動關閉該文件。不過,應養成及時關閉不再使用的文件的習慣,以避免誤操作或者干擾而產生的錯誤。