資料輸入和輸出過程也是資料傳輸的過程。資料就像流水一樣從乙個地方流動到另乙個地方,因此,在c++中將此過程稱為「流(stream)"。
在c++的標準庫中,將用於進行資料輸入輸出的類統稱為」流類「。cin是流類istream的物件,cout是流類ostream的物件。要使用流類,需要在程式中包含iostream標頭檔案。
c++中常用的幾個流類及其2相互關係:
圖1中的箭頭代表派生類。ios是抽象基類,它派生出istream和ostream。istream和ostream又共同派生出了iostream類。
為了避免多繼承的二義性,從ios派生出istream和ostream時,均使用virtual關鍵字(虛繼承)。
istream是用於輸入的流類,cin就是該類的物件。
ostream是用於輸出的流類,cout就是該類的物件。
ifstream是用於從檔案讀取資料的類。
ofstream是用於向檔案寫入資料的類。
iostream是既能用於輸入,又能用於輸出的類。
fstream是既能從檔案讀取資料,又能向檔案寫入資料的類。
標準流物件
iostream標頭檔案中定義了四個標準流物件,它們是cin、cout、cerr和clog。
cin對應於標準輸入流,用於從鍵盤讀取資料,也可以被重定向為從檔案中讀取資料。
cout對應於標準輸出流,用於向螢幕輸出資料,也可以被重定向為向檔案寫入資料。
clog對應於標準錯誤輸出流,用於向螢幕輸出錯誤資訊,不能被重定向。
cerr和clog的區別在於:cerr不適用緩衝區,直接向顯示器輸出資訊;而輸出到clog中的資訊會先被存放到緩衝區,緩衝區滿或者重新整理時才輸出到螢幕。
ostream類的無參建構函式和複製建構函式都是私有的,因此在程式中一般無法定義ostream類的物件,唯一能用的ostream類的物件就是cout。
cout可以被重定向,而cerr不能。所謂重定向,就是將輸入的源或輸出的目的地改變。例如,cout本來是輸出到螢幕的,但是經過重定向,本該輸出到螢幕上的東西就可以被輸出到檔案中。
例如:
#include using namespace std;
int main()
其中,freopen是個標準庫函式,第二個引數w代表寫模式,第三個引數代表標準輸出。該語句的作用是將標準輸出重定向為test.txt檔案。重定向之後,所有對cout的輸出都不再出現在螢幕上,而是在test.txt檔案中。
cin也可以被重定向,如果在程式中加入
freopen("input.dat", "r", stdin);
第二個引數r代表讀入方式,第三個引數stdin代表輸入。執行此語句後,cin就不再從鍵盤讀入資料,而是從input.dat檔案中讀入資料。
使用流操作運算元
c++中常用的輸入流操縱運算元如表1所示,它們都是在標頭檔案iomanip中定義的,要使用這些流操縱運算元,必須包含該標頭檔案。
note:"流操縱運算元"一欄中的*不是運算元的一部分,星號表示在沒有使用任何運算元的情況下,就等效於使用了該運算元。例如,在預設情況下,整數是十進位制形式輸出的,等效於使用了dec運算元。
流操作運算元的用法
使用這些運算元的方法是將運算元用《和cout連用。例如
cout這條語句的作用是指定以十六進製制形式輸出後面兩個數,因此輸出結果是:
c,18
setiosflags()運算元
setiosflags()運算元實際上是乙個函式庫,它以一些標誌作為引數,這些標誌可以是在iostream標頭檔案中定義的以下幾種取值,它們的含義和同名運算元一樣。
這些標誌實際上都是僅有某位元位為1,而其他位元位都為0的整數。
多個標誌可以用|運算子連線,表示同時設定。例如:
cout << setiosflags(ios::scientific|ios::showpos) << 12.34;
如果兩個相互矛盾的標誌同時被設定,如先設定setiosflags(ios::fixed),然後設定setiosflags(ios::scientific),那麼結果可能就是兩個標誌都不起作用。因此,在設定了某標誌,又要設定其他與之矛盾的標誌時,就應該用resetiosflags清除原先的標誌。例如下面的三條語句:
cout << setiosflags(ios::fixed) << 12.34 << endl;
cout << resetiosflags(ios::fixed) << setiosflags(ios::scientific | ios::showpos) << 12.34 << endl;
cout << resetiosflags(ios::showpos) << 12.34 << endl; //清除要輸出正號的標誌
輸出結果是:
12.340000
+1.234000e+001
1.234000e+001
需要注意的是,setw()運算元所起的作用是一次性的,即之影響下一次輸出,每次需要指定輸出寬度時都要使用setw()。因可以看到,第9)行的輸出因為沒有使用setw(),輸出寬度就不再是前面所指定的12個字元。
在讀入字串時,setw()還能影響cin的行為,例如下面的程式:
#include #include using namespace std;
int main()
輸入:
1234567890↙
程式的輸出結果是:
1234,567
說明setw(4)使得讀入s1時,唯讀入4個字串,其後的setw(3)使得讀入s2時唯讀入3個字元。
setw()用於cin時,同時只影響下一次的輸入。
呼叫cout的成員函式
ostream類有一些成員函式,通過cout呼叫它們也能用於控制輸出的格式,其作用和流操縱運算元相同。
這些成員函式的用法十分簡單,如:
cout.setf(ios::scientific);
cout.precision(8);
cout << 12.23 << endl;
輸出結果是:
1.22300000e+001
文章內容來自於
C 輸入 輸出流
低階i o功能 如無格式的i o 通常指大量的位元組在裝置到記憶體或記憶體到裝置的簡單傳輸。高階i o功能 格式化i o 它將位元組組合成有意義的單元,如資料型別。對於大容量檔案的處理,使用無格式的i o可獲得最佳的效能。不帶引數值成員函式get 從指定的流中讀取乙個字元 即使是空格 並返回該字元作...
C 輸入輸出流
一 c 流的概念 在c 語言中,資料的輸入和輸出 簡寫為i o 包括對標準輸入裝置鍵盤和標準輸 出裝置顯示器 對在外存磁碟上的檔案和對記憶體中指定的字串儲存空間 當然可 用該空間儲存任何資訊 進行輸入輸出這三個方面。對標準輸入裝置和標準輸出設 備的輸入輸出簡稱為標準i o,對在外存磁碟上檔案的輸入輸...
C 輸入 輸出流
一 流低階i o功能 如無格式的i o 通常指大量的位元組在裝置到記憶體或記憶體到裝置的簡單傳輸。高階i o功能 格式化i o 它將位元組組合成有意義的單元,如資料型別。對於大容量檔案的處理,使用無格式的i o可獲得最佳的效能。二 成員函式get和getline 不帶引數值成員函式get 從指定的流...