C中的沖洗緩衝區
回答
我從來沒有聽說過不沖洗輸出緩衝區,我會有興趣聽到你的來源。法拉盛輸出緩衝器:
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()
謝謝! stdin(或任何其他緩衝區)如何? – saadtaame
看我的編輯(最後一段),也許這將有所幫助。 – Mike
使用'fflush(stdin)'絕對適用於VS08/10。不管它是「明確的」還是不是我都不知道。它可能是VS中的一個「修復」,因爲我相當確定它不適用於Linux。 – ChiefTwoPencils
- 1. fgets的沖洗緩衝區
- 2. 防止沖洗緩衝區
- 3. Perl緩衝區沖洗
- 4. 如何沖洗輸入緩衝區? (C)
- 5. PyQt5 QProcess的沖洗緩衝區
- 6. 沖洗管道的緩衝區
- 7. pySerial緩衝區不會沖洗
- 8. 聲音輸出緩衝區沖洗
- 9. 輸入緩衝器沖洗
- 10. 谷歌大查詢 - 沖洗緩衝區數據(緩衝區4天數據)
- 11. C++中的位緩衝區
- 12. C,沖洗stdin
- 13. C#Convoyor-Belt-like緩衝區 - 時間受限的緩衝區
- 14. 緩衝區溢出緩衝區長度
- 15. 幀緩衝區/顏色緩衝區?
- 16. C# - ASP.NET中緩衝(MVC)和非緩衝(WEB API)的區別?
- 17. 如何在c#中緩衝RichTextBox的緩衝區?
- 18. 複製整數緩衝區如果緩衝區在C
- 19. 區分Vim中的隱藏緩衝區和活動緩衝區
- 20. XP中的C#中的UDP緩衝區
- 21. C填充緩衝區
- 22. Linux C定義緩衝區
- 23. C++ HLSL緩衝區變量
- 24. C++緩衝區疼痛
- 25. C++緩衝區與Qt
- 26. 多線程緩衝區C++
- 27. 從緩衝區讀取C
- 28. C++溢出緩衝區
- 29. C - fread()緩衝區索引
- 30. 緩衝區管理c
只需注意fflush輸出流只明確定義,它不能在輸入流中:那將是不確定的行爲。 – Lundin
@Lundin可以使用它來刷新輸出流嗎? – saadtaame
@saadtaame是的,這正是'fflush()'的用處。 – Mysticial