3 回答

TA貢獻1804條經(jīng)驗 獲得超8個贊
該stdout
流緩沖,所以將只顯示什么是在緩沖區(qū)到達后換行(或者當它告知)。您可以選擇立即打印:
使用fprintf
以下方式打印到stderr :
fprintf(stderr, "I will be printed immediately");
無論何時需要使用,都要刷新標準輸出fflush
:
printf("Buffered, will be flushed");fflush(stdout); // Will now print everything in the stdout buffer
編輯:從下面的Andy Ross的評論中,您還可以使用setbuf
以下命令禁用stdout上的緩沖:
setbuf(stdout, NULL);

TA貢獻1725條經(jīng)驗 獲得超8個贊
不,它不是POSIX行為,它是ISO行為(嗯,它是 POSIX行為,但只在它們符合ISO的范圍內(nèi))。
如果可以檢測到標準輸出是指參考交互式設備,則標準輸出是行緩沖的,否則它是完全緩沖的。所以有些情況下printf
不會刷新,即使它有一個換行符,例如:
myprog >myfile.txt
這對效率很有意義,因為如果您與用戶進行交互,他們可能希望看到每一行。如果您將輸出發(fā)送到文件,則很可能是另一端沒有用戶(盡管不是不可能,但他們可能正在拖尾文件)。現(xiàn)在你可以爭辯說用戶想要看到每個角色但是有兩個問題。
首先是它效率不高。第二個原因是ANSI C的原始授權主要是對現(xiàn)有行為進行編碼,而不是發(fā)明新行為,而這些設計決策是在ANSI開始流程之前做出的。在改變標準中的現(xiàn)有規(guī)則時,即便是ISO現(xiàn)在也非常謹慎。
至于如何處理,如果fflush (stdout)
你想要立即看到每個輸出調(diào)用后,這將解決問題。
或者,您可以setvbuf
在操作之前使用stdout
,將其設置為無緩沖,您不必擔心將所有這些fflush
行添加到您的代碼中:
setvbuf (stdout, NULL, _IONBF, BUFSIZ);
只要記住這可能會影響性能相當多,如果你正在發(fā)送輸出到文件。另請注意,對此的支持是實現(xiàn)定義的,不受標準保證。
ISO C99部分7.19.3/3
是相關位:
當流未緩沖時,字符應盡快從源或目的地出現(xiàn)。否則,可以將字符作為塊累積并發(fā)送到主機環(huán)境或從主機環(huán)境發(fā)送。
當流被完全緩沖時,當填充緩沖區(qū)時,字符將作為塊傳輸?shù)街鳈C環(huán)境或從主機環(huán)境傳輸。
當流被線緩沖時,當遇到換行符時,字符將作為塊傳輸?shù)街鳈C環(huán)境或從主機環(huán)境傳輸。
此外,當填充緩沖區(qū),在無緩沖流上請求輸入時,或者在需要從主機環(huán)境傳輸字符的行緩沖流上請求輸入時,字符旨在作為塊傳輸?shù)街鳈C環(huán)境。 。
對這些特性的支持是實現(xiàn)定義的,并且可能通過
setbuf
和setvbuf
函數(shù)受到影響。

TA貢獻1831條經(jīng)驗 獲得超9個贊
這可能是因為效率,因為如果你有多個程序?qū)懭雴蝹€TTY,這樣你就不會在一行上交換字符。因此,如果程序A和B正在輸出,您通常會得到:
program A output program B output program B output program A output program B output
這很糟糕,但它比
proprogrgraam m AB ououtputputt prproogrgram amB A ououtputtput program B output
請注意,它甚至不能保證在換行符上刷新,因此如果刷新對您很重要,則應明確刷新。
- 3 回答
- 0 關注
- 677 瀏覽
添加回答
舉報