他們之間有什麼區別,他們是如何使用? 任何人都可以指點我的例子嗎?什麼是「cerr」和「stderr」?
具體來說,在這兩種情況下你如何「寫」流,以及如何恢復和輸出(即屏幕)已寫入的文本?
此外,「屏幕」輸出本身是一個流權?也許我不太瞭解流。我知道這也可以保存到一個文件當然。所有這些會使用fprintf
/fscanf
等?
他們之間有什麼區別,他們是如何使用? 任何人都可以指點我的例子嗎?什麼是「cerr」和「stderr」?
具體來說,在這兩種情況下你如何「寫」流,以及如何恢復和輸出(即屏幕)已寫入的文本?
此外,「屏幕」輸出本身是一個流權?也許我不太瞭解流。我知道這也可以保存到一個文件當然。所有這些會使用fprintf
/fscanf
等?
cerr
是C++流而stderr
是C文件句柄,它們都表示標準錯誤輸出。
你寫信給他們,你寫信給其他流和文件的方式處理:
cerr << "Urk!\n";
fprintf (stderr, "Urk!\n");
我不知道你在這種情況下「恢復」的意思,輸出到標準錯誤,而已。該計劃在此之後不打算關心它。如果你的意思是如何從程序之外保存它,請參閱下一段。
默認情況下,他們會去你的終端,但輸出可以在其他的東西,如被重定向:
run_my_prog 2>error.out
而且,是的,「屏幕」輸出流(或文件句柄),但這通常只是因爲stdout/cout
和stderr/cerr
默認連接到你的「屏幕」。重定向會影響本作在以下情況下什麼都不會被寫入到你的屏幕:
run_my_prog >/dev/null 2>&1
(技巧性的東西像直接寫入/dev/tty
儘管)。該片段將重定向標準輸出和標準錯誤以轉到位桶。
另一個區別在於標準錯誤不是緩衝(即每次寫入時自動刷新),就是行緩存(在每個\ n上自動刷新),無論它是否指向交互式設備。相比之下,如果(並且僅在)它不涉及交互式設備,則標準輸出會被完全緩衝。 – 2010-07-08 02:05:02
嗯,從技術上講,這是stdrr和stderr(或者cout和cerr)之間的區別,而不是cerr和stderr :-) – paxdiablo 2010-07-08 03:52:29
它們有什麼
stderr
之間的差別是FILE*
,標準C庫的一部分。 cerr
是ostream
,是標準C++庫的一部分。
此外,「屏幕」輸出本身是一個 流正確嗎?
是的。但實際上有兩個默認寫入屏幕的流:stdout
/cout
用於正常輸出,而stderr
/cerr
用於出錯消息。這對於重定向很有用:您可以將stdout
重定向到文件,但仍然在屏幕上顯示錯誤消息。
是否可以從std :: ostream cerr對象獲得FILE * stderr指針? (類似'cerr.rdbuf() - > bla') – alfC 2013-11-03 05:32:27
@alfC:沒有一個標準的方法來做到這一點。請參閱http://stackoverflow.com/questions/109449/getting-a-file-from-a-stdfstream。 – dan04 2016-11-30 22:27:59
是的,我回答了http://stackoverflow.com/a/19749019/225186。我認爲最優雅的答案是這樣的:http://stackoverflow.com/a/33612982/225186 – alfC 2016-11-30 23:39:49
不需要道歉詢問新手問題。 SO是用於所有技能水平的。 – paxdiablo 2010-07-08 01:43:27