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
)