C++ 流类和流对象
程序中常用的 cin 和 cout,分別用于從鍵盤輸入數據和向屏幕輸出數據(簡稱為標準 I/O)。除此之外,程序還可以從文件中讀入數據,以及向文件中寫入數據(簡稱為文件 I/O)。
數據輸入和輸出的過程也是數據傳輸的過程。數據像水一樣從一個地方流動到另一個地方,因此,在 C++ 中將此過程稱為 “流(stream)”。
在 C++ 的標準類庫中,將用于進行數據輸入輸出的類統稱為“流類”。cin 是流類 istream 的對象,cout 是流類 ostream 的對象。要使用流類,需要在程序中包含 iostream 頭文件。
C++ 中常用的幾個流類及其相互關系如下圖所示。
圖中的箭頭代表派生關系。例如,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 對應于標準輸出流,用于向屏幕輸出數據,也可以被重定向為向文件寫入數據。cerr 對應于標準錯誤輸出流,用于向屏幕輸出出錯信息,不能被重定向。clog 對應于標準錯誤輸出流,用于向屏幕輸出出錯信息,不能被重定向。cerr 和 clog的區別:cerr 不使用緩沖區,直接向顯示器輸出信息;而輸出到 clog 中的信息會先被存放到緩沖區,緩沖區滿或者刷新時才輸出到屏幕。
cout 是 ostream 類的對象。在 Visual Studio 2010 安裝文件夾中有vc\crt\src\cout.cpp文件,該文件中 cout 的定義如下:
_PURE_APPDOMAIN_GLOBAL static filebuf fout(_cpp_stdout); _PURE_APPDOMAIN_GLOBAL extern _CRTDATA2 ostream cout (&fout);簡單地看,就是:
ostream cout(&fout);ostream 類的無參構造函數和復制構造函數都是私有的,因此在程序中一般無法定義 ostream 類的對象,唯一能用的 ostream 類的對象就是 cout。
當然,上面關于 cout 對象的定義語句說明 ostream 類是有一個公有構造函數的,如果知道這個構造函數是什么樣的,那么也能自己定義 ostream 類的對象。
cout 可以被重定向,而 cerr 不能。所謂重定向,就是將輸入的源或輸出的目的地改變。例如,cout 本來是輸出到屏幕上的,但是經過重定向,本該輸出到屏幕上的東西就可以被輸出到文件中。
例如下面的程序:
#include <iostream> using namespace std; int main() {int x,y;cin >> x >> y;freopen("test.txt", "w", stdout); //將標準輸出重定向到 test.txt文件if( y == 0 ) //除數為0則輸出錯誤信息cerr << "error." << endl;elsecout << x /y ;return 0; }第 7 行的 freopen 是一個標準庫函數,第二個參數 w 代表寫模式,第三個參數代表標準輸出。該語句的作用是將標準輸出重定向為 test.txt 文件。
重定向之后,所有對 cout 的輸出都不再出現在屏幕上,而是出現在 test.txt 文件中。
test.txt 文件會和本程序的可執行文件出現在同一個文件夾中。重定向僅對本程序有效,不影響其他程序。
運行本程序,輸入
6 2程序沒有輸出,但是打開 test.txt文件,可以看到文件中有
3如果輸入
4 0則程序在屏幕上輸出
error.說明 cerr 不會被重定向。
cin 也是可以被重定向的。如果在程序中加入
freopen("input.dat", "r", stdin);第二個參數 r 代表讀入方式,第三個參數 stdin 代表標準輸入。執行此語句后,cin 就不再從鍵盤讀入數據,而是從 input.dat 文件中讀人數據,input.dat 文件中有什么,就相當于從鍵盤輸入了什么。
總結
以上是生活随笔為你收集整理的C++ 流类和流对象的全部內容,希望文章能夠幫你解決所遇到的問題。