1. 程式人生 > >cout, cerr, clog的區別和windows下的重定向

cout, cerr, clog的區別和windows下的重定向

1、cout,cerr,clog的區別

《C++ Primer》第四版中解釋為:標準庫定義了 4 個 IO 物件。處理輸入時使用命名為 cin(讀作 see-in)的 istream 型別物件。這個物件也稱為標準輸入。處理輸出時使用命名為 cout(讀作 see-out)的 ostream 型別物件,這個物件也稱為標準輸出。標準庫還定義了另外兩個 ostream 物件,分別命名為 cerr 和 clog(分別讀作“see-err”和“see-log”)。cerr 物件又叫作標準錯誤,通常用來輸出警告和錯誤資訊給程式的使用者。而 clog 物件用於產生程式執行的一般資訊。一般情況下,系統將這些物件與執行程式的視窗聯絡起來。這樣,當我們從cin 讀入時,資料從執行程式的視窗讀入,當寫到 cin、cerr 或 clog 時,輸出寫至同一視窗。執行程式時,大部分作業系統都提供了重定向

輸入或輸出流的方法。利用重定向可以將這些流與所選擇的檔案聯絡起來。

查閱網上的一些資料,基本區別如下:

cerr(無緩衝)---------------標準錯誤,傳送給它的內容立即被輸出

clog(有緩衝)---------------標準錯誤,緩衝區滿時輸出
cout(有緩衝)---------------標準輸出
三個都是ostream類定義的輸出流物件,
cout是在終端顯示器輸出, cout流在記憶體中對應開闢了一個緩衝區,用來存放流中的資料, 當向cout流插入一個endl, 不論緩衝區是否漫了,都立即輸出流中所有資料, 然後插入一個換行符.
cerr流物件是標準錯誤流,指定為和顯示器關聯,和cout作用差不多

clog流也是標準錯誤流,作用和cerr一樣,區別在於cerr不經過緩衝區,直接向顯示器輸出資訊,而clog中的資訊存放在緩衝區,緩衝區滿或者遇到endl時才輸出。 

它們三個在windows平臺下都可以重定向輸出。

關於緩衝區:

endl 是一個特殊值,稱為操縱符,將它寫入輸出流時,具有輸出換行的效果,並重新整理與裝置相關聯的緩衝區。通過重新整理緩衝區,使用者可立即看到寫入到流中的輸出。
 程式設計師經常在除錯過程中插入輸出語句,這些語句都應該重新整理輸出流。忘記重新整理輸出流可能會造成輸出停留在緩衝區中,如果程式崩潰,將會導致程式錯誤推斷崩潰位置。

那麼什麼是重新整理緩衝區呢?到網上找到資料如下:

以緩衝方式開啟一個檔案時,往檔案裡寫幾個位元組,一般不會立即真正把這幾個位元組寫入檔案,只有當緩衝區滿時才真正寫盤。如果想在緩衝區滿之前寫盤儲存,可以做沖刷緩衝區動作。

下列行為引發沖刷動作:
1)緩衝區滿時;
2)行輸出時遇endl,cerr或cin時;
3)執行沖刷函式;
4)關閉檔案。


2、重定向

重定向命令列命令: cmd > file 把cout重定向到file檔案中; cmd >> file 把cout重定向到file檔案中(追加); cmd 1> fiel 把cout重定向到file檔案中; cmd > file 2>&1 把cout、cerr和clog一起重定向到file檔案中; cmd 2> file 把cerr、clog 重定向到file檔案中; cmd 2>> file 把cerr、clog重定向到file檔案中(追加); cmd >> file  2>&1 把cout、cerr和clog一起重定向到file檔案中(追加);

windows下編寫下面程式

// test.cpp

#include<iostream>

using namespace std;

int main ()

{

cout << "cout" << endl;

cerr << "cerr" << endl;

clog << "clog" << endl;

cout << "cout2" << endl;

return 0

}

命令列下執行:

1.test >file.txt          

   (file檔案結果:cout

          cout2

    )

2.test >>file.txt          

   (file檔案結果:cout

          cout2

      cout

      cout2

    )

3.test 2>file.txt          

   (file檔案結果:cout

                  cerr

      clog

      cout2

    )