C 中cout cerr clog的區別

2021-07-12 04:36:56 字數 3330 閱讀 7896

之前一直在用,但就是沒在意兩者到底有啥卻別,今天又想到這個問題,總結下吧(以下的內容均是本人從網上查閱資料看來整理的,暫時還沒有查閱官方資料,不保證準確,歡迎討論)

其實大家平常常會用的主要有三個:cout、cerr、clog,首先簡單介紹下三者。

這三者在c++中都是標準io庫中提供的輸出工具:

cout:寫到標準輸出的ostream物件;

cerr:輸出到標準錯誤的ostream物件,常用於程式錯誤資訊;

clog:也是輸出標準錯誤流(這點兒和cerr是一樣的),貌似平時很少用到這個啊;

具體在輸出的時候,三者是有區別的:

1、cout經過緩衝後輸出,預設情況下是顯示器。這是乙個被緩衝的輸出,是標準輸出,並且可以重新定向(關於重新定向的意思可以參考下面的例子);

2、cerr不經過緩衝而直接輸出,一般用於迅速輸出出錯資訊,是標準錯誤,預設情況下被關聯到標準輸出流,但它不被緩衝,也就說錯誤訊息可以直接傳送到顯示器,而無需等到緩衝區或者新的換行符時,才被顯示。一般情況下不被重定向(重定向這點兒好像有爭論,有些人說和系統有關,本人還不太明白)

對於為什麼有cerr和clog

比如,你的程式遇到呼叫棧用完了的威脅(無限,沒有出口的遞迴)。

你說,你到什麼地方借記憶體,存放你的錯誤資訊?

所以有了cerr。其目的,就是在你最需要它的緊急情況下,還能得到輸出功能的支援。

緩衝區的目的,就是減少刷屏的次數——比如,你的程式輸出聖經中的一篇文章。不帶緩衝的話,就會每寫乙個字母,就輸出乙個字母,然後刷屏。有了緩衝,你將看到若干句子「同時」就出現在了螢幕上(由記憶體翻新到視訊記憶體,然後重新整理螢幕)。

附: #include

using namespace std;

int main()

執行此程式之後,我們在命令列執行如下命令:

假設編譯執行後的可執行檔名為cerr.exe,其目錄為e:\cpro\cerr\debug\cerr.exe

在命令列下,切換到這個目錄下,執行命令:cerr>test.log

命令列輸出如下:

e:\cpro\cerr\debug>cerr>>test2.log

cerr(這是在命令列下輸出的)

檢視test2.log檔案,發現裡面只有

cout

一行。可能這個就是所謂的重定向輸出。

從這裡可以看出:

cout是在終端顯示器輸出,cout流在記憶體中對應開闢了乙個緩衝區,用來存放流中的資料,當向cout流插入乙個endl,不論緩衝區是否漫了,都立即輸出流中所有資料,然後插入乙個換行符. 

cerr流物件是標準錯誤流,指定為和顯示器關聯,和cout作用差不多,有點不同就是cout 

通常是傳到顯示器輸出,但可以被重定向輸出到檔案,而cerr流中的資訊只能在顯示器輸出. 

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

"標準庫定義了4個io物件,處理輸入時使用命名為cin的istream型別物件,這個物件也成為標準輸入。處理輸出時使用命名為cout的ostream型別物件,這個物件也稱為標準輸出。標準庫還定義了另外兩個ostream物件,分別命名為cerr和clog。cerr物件又叫標準錯誤,通常用來輸出警告和錯誤資訊給程式的使用者,而clog物件用於產生程式執行的一般資訊。一般情況下,系統將這些物件與執行視窗聯絡起來,這樣,當我們從cin讀入時,資料從執行程式的視窗讀入,當寫到cout、cerr、clog時,輸出寫至同一視窗。執行程式時,大部分作業系統都提供了重定向輸入或者輸出流的方法。利用重定向可以將這些流與所選擇的檔案聯絡起來"

關於cerr clog cout的區別:

在csdn上搜到一篇博文: 原文如下,感謝原作者。

c++裡關於cerr,clog,cout三者的區別:

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

clog(緩衝標準錯誤)------------有緩衝,緩衝區滿時輸出

cout--------------------------------標準輸出

三個都是ostream類定義的輸出流物件.

cout是在終端顯示器輸出,cout流在記憶體中對應開闢了乙個緩衝區,用來存放流中的資料,當向cout流插入乙個endl,不論緩衝區是否滿了,都立即輸出流中所有資料,然後插入乙個換行符.

cerr流物件是標準錯誤流,指定為和顯示器關聯,和cout作用差不多,有點不同就是cout

通常是傳到顯示器輸出,但可以被重定向輸出到檔案,而cerr流中的資訊只能在顯示器輸出.

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

3.關於《和》操作符:

書上要點總結如下:

std::cout << "enter two numbers:" << std::endl;

輸出操作符例項都接受兩個運算元:左運算元必須是 ostream 物件;右運算元是要輸出的值。操作符將其右運算元寫到作為其左運算元的 ostream 物件。

c++ 中,每個表示式都會產生乙個結果,通常是將操作符作用到其運算元所產生的值。當操作符是輸出操作符時,結果是左運算元的值。也就是說,輸出操作返回的值是輸出流本身。

輸入操作符(>> 操作符)行為與輸出操作符相似。它接受乙個 istream 物件作為其左運算元,接受乙個物件作為其右運算元,它從 istream 運算元讀取資料並儲存到右運算元中。像輸出操作符一樣,輸入操作符返回其左運算元作為結果。

在寫 c++ 程式時,大部分出現空格符的地方可用換行符代替。這條規則的乙個例外是字串字面值中的空格符不能用換行符代替。另乙個例外是空格符不允許出現在預處理指示中。

std::cout << "the sum of " << v1 << " and " << v2

<< " is " << v1 + v2 << std::endl;

4.關於緩衝區:

endl 是乙個特殊值,稱為操縱符,將它寫入輸出流時,具有輸出換行的效果,並重新整理與裝置相關聯的緩衝區。通過重新整理緩衝區,使用者可立即看到寫入到流中的輸出。

程式設計師經常在除錯過程中插入輸出語句,這些語句都應該重新整理輸出流。忘記重新整理輸出流可能會造成輸出停留在緩衝區中,如果程式崩潰,將會導致程式錯誤推斷崩潰位置。

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

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

1)緩衝區滿時;

2)行輸出時遇endl,cerr或cin時;

3)執行沖刷函式;

4)關閉檔案。

**:

C 中cout,cerr,clog的區別

c 標準庫定義了4個io物件,cin,cout,cerr,clog cin 為標準輸入,cout,cerr,clog都是輸出流物件,三者有什麼區別呢?cout 與cerr的主要區別是cout的輸出資訊可以被重定向到檔案中,而cerr則只能輸出到標準輸出 顯示器 上。int main 但是cout可以...

C 中cout,cerr,clog的區別

c 標準庫定義了4個io物件,cin,cout,cerr,clog cin 為標準輸入,cout,cerr,clog都是輸出流物件,三者有什麼區別呢?cout 與cerr的主要區別是cout的輸出資訊可以被重定向,而cerr則只能輸出到標準輸出 顯示器 上。例如下面程式編譯後生成test.exe t...

C 中的long與C 中的long

微軟很厲害,c 是非常優秀的計算機語言,c 比c 還厲害,c c 本身不就包含四個 號嗎?而微軟發明了c c 中的long比c 中的long要long兩倍!不信你看 我正在使用.net寫乙個預約排隊的程式,因為一前通過vc編寫了乙個用於顯示登記資訊的控制項,現在使用c 重新預約程式,則必然要呼叫vc...