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