2010-07-08 59 views
25

他們之間有什麼區別,他們是如何使用? 任何人都可以指點我的例子嗎?什麼是「cerr」和「stderr」?

具體來說,在這兩種情況下你如何「寫」流,以及如何恢復和輸出(即屏幕)已寫入的文本?

此外,「屏幕」輸出本身是一個流權?也許我不太瞭解流。我知道這也可以保存到一個文件當然。所有這些會使用fprintf/fscanf等?

+8

不需要道歉詢問新手問題。 SO是用於所有技能水平的。 – paxdiablo 2010-07-08 01:43:27

回答

32

cerr是C++流而stderr是C文件句柄,它們都表示標準錯誤輸出。

你寫信給他們,你寫信給其他流和文件的方式處理:

cerr << "Urk!\n"; 
fprintf (stderr, "Urk!\n"); 

我不知道你在這種情況下「恢復」的意思,輸出到標準錯誤,而已。該計劃在此之後不打算關心它。如果你的意思是如何從程序之外保存它,請參閱下一段。

默認情況下,他們會去你的終端,但輸出可以在其他的東西,如被重定向:

run_my_prog 2>error.out 

而且,是的,「屏幕」輸出流(或文件句柄),但這通常只是因爲stdout/coutstderr/cerr默認連接到你的「屏幕」。重定向會影響本作在以下情況下什麼都不會被寫入到你的屏幕:

run_my_prog >/dev/null 2>&1 

(技巧性的東西像直接寫入/dev/tty儘管)。該片段將重定向標準輸出和標準錯誤以轉到位桶。

+2

另一個區別在於標準錯誤不是緩衝(即每次寫入時自動刷新),就是行緩存(在每個\ n上自動刷新),無論它是否指向交互式設備。相比之下,如果(並且僅在)它不涉及交互式設備,則標準輸出會被完全緩衝。 – 2010-07-08 02:05:02

+2

嗯,從技術上講,這是stdrr和stderr(或者cout和cerr)之間的區別,而不是cerr和stderr :-) – paxdiablo 2010-07-08 03:52:29

6

它們有什麼

stderr之間的差別是FILE*,標準C庫的一部分。 cerrostream,是標準C++庫的一部分。

此外,「屏幕」輸出本身是一個 流正確嗎?

是的。但實際上有兩個默認寫入屏幕的流:stdout/cout用於正常輸出,而stderr/cerr用於出錯消息。這對於重定向很有用:您可以將stdout重定向到文件,但仍然在屏幕上顯示錯誤消息。

+0

是否可以從std :: ostream cerr對象獲得FILE * stderr指針? (類似'cerr.rdbuf() - > bla') – alfC 2013-11-03 05:32:27

+0

@alfC:沒有一個標準的方法來做到這一點。請參閱http://stackoverflow.com/questions/109449/getting-a-file-from-a-stdfstream。 – dan04 2016-11-30 22:27:59

+0

是的,我回答了http://stackoverflow.com/a/19749019/225186。我認爲最優雅的答案是這樣的:http://stackoverflow.com/a/33612982/225186 – alfC 2016-11-30 23:39:49