一、 IO類
1、在IO類中有三個獨立的頭文件,如下:
iostream
:定義了用於讀寫流的基本類型fstream
:定義讀寫命名文件的類型sstream
:定義讀寫內存中string對象的類型
2、IO庫類型和文件:
頭文件 | 類型 |
---|---|
iostream | istream:從流中讀取數據 ostream:向流中寫入數據 iostream:讀寫流 |
fstream | ifstream:從文件中讀取數據 ofstream:向文件中寫入數據 fstream:讀寫文件 |
sstream | istringstream:從string 中讀取數據 ostringstream:向string 中寫入數據 stringstream:讀寫string |
3、各類型的繼承關係
4、不能對IO對象進行拷貝或這賦值
// 正確,可以將初始值與流對象進行綁定初始化
ofstream out1("D:\\Files\\TheFile\\log01.txt");
// 錯誤,不能對流對象進行賦值
ofstream out2;
out2 = out1;
因爲不能進行拷貝流對象,因此不可以將形參或返回類型設置爲流類型。進行IO操作的函數通常以引用方式來傳遞和返回流。讀寫一個IO對象會改變其狀態,因此傳遞和返回的引用不能爲const
5、IO對象操作的條件狀態
在IO操作中一個流一旦發生錯誤,其上後續的IO操作都會失敗。由於流可能會出現錯誤,因此在使用一個流之前最好要檢查它是否處於良好的狀態。可以將其當作一個條件來進行使用。
while(cin>>word)
{
//當以上流無錯誤時纔會進行對應的操作。
}
while 循環檢查條件中所返回流的狀態,如果輸入操作成功,流保持有效狀態,此時條件爲真。
6、輸出緩衝管理
(1)、每個輸出流都管理一個緩衝區,用來保存程序讀寫的緩衝數據。如執行 cout<<"hello";
代碼,文本可能立刻打印,也可能被操作系統保存到緩衝區中,隨後才進行打印。有了設備緩衝機制,操作系統就可以將多個輸出操作組合成單一的系統級寫操作。由於設備的寫操作會很耗時,這樣的操作可以大大的提高系統的性能。
(2)、導致緩衝刷新的主要原因如下:
- 程序正常結束時,緩衝被刷新。
- 緩衝區滿時,需要刷新緩衝,才能將新的數據寫入到緩衝區
- 可以使用endl來顯式的刷新緩衝區。
- 可以使用操作符unitbuf來設置內部流狀態,清空緩衝區。默認情況下對cerr是設置unitbuf的,因此寫到cerr中的內容是立刻被刷新的。
- 一個輸出流可能會被關聯到另一個流,這種情況下,當讀寫被關聯的流時,關聯到的流的緩衝區會被刷新。如默認
cin
和cerr
都關聯到cout
。因此讀cin
或寫cerr
都會導致cout
的緩衝區被刷新。
(3)、IO庫中有三個操縱符:endl
、flush
、ends
。其中endl刷新緩衝區並換行;flush刷新緩衝區,但是不輸出任何額外字符;ends向緩衝區中插入一個空字符,然後刷新緩衝區。
cout << "hi" << endl; //輸出hi和一個換行符,然後刷新緩衝區
cout << "hi" << flush; //輸出hi,然後刷新緩衝區,不附加任何額外字符
cout << "hi" << ends; //輸出hi和一個空格,然後刷新緩衝區
(4)、unitbuf 操縱符。如果向每次輸出操作後都刷新緩衝區,可以使用 unitbuf。它在接下來的每次寫操作之後都進行一次flush
操作。而nounitbuf則重置流,使其恢復之前的狀態。
//所有輸出操作後都立即刷新緩衝區
cout<<unitbuf;
//回到正常緩衝方式
cout<<nounitbuf;