C++ 語言不直接處理輸入輸出,而是通過一組定義在標準庫的類型處理IO。其主要包括 iostream(讀寫流的基本類型) fstream(讀寫文件的類型) sstream(讀寫內存string對象的類型)
1 IO類 頭文件<iostream>
不能拷貝或對IO對象賦值。常用引用方式傳遞和返回流。
IO操作可能發生錯誤,可以使用一些函數以及標誌來訪問和操縱流的條件狀態。
確定一個流對象的狀態的最簡單的方式是將他當做一個條件來使用,如:
while (cin>>word)
....
每個輸出流都管理一個緩衝區,用來保存程序讀寫的數據。有了緩衝機制,操作系統就可以將程序的多個輸出操作組合成單一的系統級寫操作,因爲設備的寫操作很耗時,因此此舉可以帶來很大的性能提升。
導致緩衝刷新的原因:程序正常結束;緩衝區滿了;手動操作,如endl ;用操縱符unitbuf設置流的內部狀態,清空緩衝區;一個輸出流被關聯到另一個流。
刷新輸出緩衝區:
cout<<"hi"<<endl; // 輸出hi + \n
cout<<"hi"<<flush; // 輸出hi
cout<<"hi"<<ends; // 輸出hi + ‘ ’
cout<<unitbuf; // 所有輸出操作之後都立即刷新緩衝區
...
cout<<nounitbuf; // 回到正常的緩衝方式
另外,因爲標準庫將cout 與cin 關聯在一起,所以輸入任何值同樣導致輸出緩衝區刷新,要綁定流,用tie
如果程序崩潰,輸出緩衝區不會被刷新。
2 文件輸入輸出 頭文件<fstream>
當我們想要讀寫一個文件時,可以定義一個文件流對象,並將對象與文件關聯起來,如:
ifstream in(ifile);
ofstream out;
out.open(ifile + ".copy"); if (out) ...
每個流都有一個文件模式,指出如何使用文件:
in 讀
out 寫
app 追加
ate 打開文件後即定位到結尾
trunc 截斷文件
binary 二進制讀寫
默認情況,ifstream用in打開,ofstream用out打開,fstream用in和out打開
3 string流 頭文件<sstream>
當我們的某些工作是對整行文本進行處理,而其他一些工作是處理行內的單個單詞時,通常可以使用istringstream,如:
string line, word;
while (getline(cin,line)) // 讀取一行存入string對象line
{
istringstream is(line); // 將string對象轉換成is流對象
while (is>>word) // 每次讀取一個string對象word
...
}