IO操作需要支持不同類型的設備和不同類型數據的接口。所以IO標準庫使用了繼承來定義一組面向對象的類。
### 1.首先IO類型在三個頭文件中定義
iostream定義控制窗口讀寫的類型,fstream定義讀寫已命名文件的類型,sstring定義讀寫存儲在內存中string對象(這個在做ACM的很多題目的時候很方便,這個在后面會提一下)。由于集成關系加上多態的特性(動態綁定)我們可以用istream&即使用istream的一個引用來作為形參,這樣既可以使用istream對象做實參,也可以使用ifstream和istringstream對象來做實參,同理ostream&引用類型類似,這里不做復述了。
歡迎訪問本人csdn博客:http://blog.csdn.net/IAccepted
### 2. IO對象不可以復制或賦值
原因:之所以不能被復制原因就是IO對象的復制構造函數是私有的。
導致的結果:
1).只有支持復制的元素類型可以存儲在vector或其他容器里,由于流對象不能被復制的原因,所以流對象不能存儲在容器中。
2).形參或返回類型也不能為流對象。
原因是流類的復制構造函數是私有的,不能被調用,而我們都知道當形參或返回值為對象類型時都要調用對象的復制構造函數進行對象的拷貝。
如果需要傳遞或返回IO對象,則必須傳遞或返回只想該對象的指針或引用。
歡迎訪問本人csdn博客:http://blog.csdn.net/IAccepted
### 3.輸出緩沖區管理
每個IO對象管理一個緩沖區,用于存儲程序讀寫的數據。通常以下幾種情況將導致緩沖區的內容被刷新(即寫入到真實的輸出設備或者文件中)。
1).程序正常結束。作為main返回工作的一部分,將清空所有輸出緩沖區。
2).緩沖區已滿,這時緩沖區將會在寫入下一個值之前刷新。
3).程序員自己顯示刷新,這就依靠特定的操作符,通常用endl。
4).將輸出流與輸入流關聯,這樣,在讀入時將刷新關聯的輸出緩沖區。
### 4.文件的輸入和輸出
早期C語言的原因,IO標準庫使用是C語言風格的字符串而不是C++風格的string字符串作為文件名,所以通常我們會講string類型的字符串通過調用c_str類型轉化為C風格字符串進行文件打開。
1).要養成打開文件后文件打開狀態檢測的好習慣。
2).當用一個流去操作多個文件時一定要清除文件流的狀態即調用clear()方法。因為關閉流不能改變流對象的內部狀態,如果一次讀寫操作失敗,即使關閉流對象再打開也不能避免上次保持的錯誤狀態,所以一定要調用clear()來清除這種錯誤狀態。
3).文件模式只是文件的屬性,而不是流的屬性。ofstream::app ? ofstream::in ? ?ofstream::out 等等。
### 5.字符串流
在ACM中有些題目是整行讀入一個句子然后逐個單詞進行處理,這個時候字符串流就會使得操作相當的簡單。
例如杭電OJ2072,代碼如下,使用了istringstream后就很方便。
~~~
#include <iostream>
#include <set>
#include <sstream>
#include<string.h>
using namespace std;
int main()
{
string ss;
while(getline(cin,ss) && ss!="#")
{
istringstream stream(ss);
set<string> s; //放在這里,每次都是新容器
string word;
while(stream >>word)
{
s.insert(word);
}
cout<<s.size()<<endl;
}
return 0;
}
~~~
歡迎訪問本人csdn博客:http://blog.csdn.net/IAccepted