2012-09-16 193 views
41

即使是輸出流,fflush()也不應該用於沖洗緩衝區?C中的沖洗緩衝區

它有什麼用?一般來說,我們如何沖洗一個緩衝區?

+0

只需注意fflush輸出流只明確定義,它不能在輸入流中:那將是不確定的行爲。 – Lundin

+0

@Lundin可以使用它來刷新輸出流嗎? – saadtaame

+2

@saadtaame是的,這正是'fflush()'的用處。 – Mysticial

回答

75

我從來沒有聽說過不沖洗輸出緩衝區,我會有興趣聽到你的來源。法拉盛輸出緩衝器:

printf("Buffered, will be flushed"); 
fflush(stdout); // Prints to screen or whatever your standard out is 

fprintf(fd, "Buffered, will be flushed"); 
fflush(fd); //Prints to a file 

可以是一個非常有用的技術。你爲什麼要刷新一個輸出緩衝區?通常當我這樣做的時候,這是因爲代碼崩潰了,我試圖調試一些東西。標準緩衝區不會在您每次打電話時打印printf(),它會一直等到它滿了然後立即轉儲一堆。所以如果你想在碰撞發生之前檢查你是否正在調用一個函數,那麼printf會有幫助,比如「got here!」,有時在崩潰發生之前緩衝區沒有被刷新,你可以不知道你真的得到了多少。

另一次有用的是多進程或多線程代碼。同樣,緩衝區並不總是在對printf()的調用時刷新,所以如果你想知道多個進程的執行順序,你應該在每次打印之後刷新緩衝區。

我養成這樣做的習慣,它在調試時節省了很多頭痛。我認爲唯一的缺點是printf()是一個昂貴的操作(這就是爲什麼它不會默認刷新緩衝區)。


至於沖洗輸入緩衝器(stdin),你不應該這樣做。沖洗stdin是根據C11標準未定義的行爲§7.21.5.2第2部分:

如果流點到輸出流... fflush函數導致該流的任何未寫入的數據...將被寫入到文件;否則,行爲是不確定的。

在某些系統,Linux是一個你可以在手冊頁看到fflush(),有一個定義的行爲,但它是依賴於系統,使您的代碼將不能移植。現在,如果你在輸入緩衝區很擔心垃圾「卡殼」

您可以使用上fpurge()。 見here更多關於fflush()fpurge()

+1

謝謝! stdin(或任何其他緩衝區)如何? – saadtaame

+0

看我的編輯(最後一段),也許這將有所幫助。 – Mike

+0

使用'fflush(stdin)'絕對適用於VS08/10。不管它是「明確的」還是不是我都不知道。它可能是VS中的一個「修復」,因爲我相當確定它不適用於Linux。 – ChiefTwoPencils