C++流類庫(11)


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()) {...} 

 demo傳送門

典型流成員函數

輸出流的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成員函數用來關閉與一個文件流相關聯的磁盤文件。如果沒有關閉該文件,因為文件流是對象,所以在文件流對象的生存期結束時,將自動關閉該文件。不過,應養成及時關閉不再使用的文件的習慣,以避免誤操作或者干擾而產生的錯誤。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM