C 輸入輸出流

2021-09-24 09:23:15 字數 3466 閱讀 4333

資料輸入和輸出過程也是資料傳輸的過程。資料就像流水一樣從乙個地方流動到另乙個地方,因此,在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 從指定的流...