【发布时间】:2015-03-15 15:34:20
【问题描述】:
我很难理解缓冲的深度,尤其是在 C 编程中,我在这个主题上搜索了很长时间,但直到现在还没有找到令人满意的东西。
我会更具体一点: 我确实理解它背后的概念(即协调不同硬件设备的操作并最大限度地减少这些设备的速度差异),但我希望能更全面地解释这些和其他潜在的缓冲原因(我的意思是完整的)越长越好)如果能给出一些具体的例子来说明如何在 I/O 流中实现缓冲也是非常好的。
其他问题是我注意到我的程序没有遵循缓冲区刷新中的一些规则,因为这听起来像下面的简单片段:
#include <stdio.h>
int main(void)
{
FILE * fp = fopen("hallo.txt", "w");
fputc('A', fp);
getchar();
fputc('A', fp);
getchar();
return 0;
}
该程序旨在演示当第一个 getchar() 被调用时,即将发生的输入将立即刷新任意流,但这根本不会像我尝试它那样经常发生,并且我想要进行尽可能多的修改——它根本没有对于stdout(例如printf())不会发生这种情况,流在没有任何输入请求的情况下被刷新也否定了规则,因此我是否错误地理解了这条规则或者还有其他需要考虑的事情
我在 Windows 8.1 上使用 Gnu GCC。
更新:
我忘了问我在某些网站上阅读了人们如何引用,例如字符串文字作为缓冲区,甚至数组作为缓冲区;这是正确的还是我错过了什么? 也请解释一下。
【问题讨论】:
-
对于示例,您不是在写入
stdout,而是在写入任意文件。 -
对不起我改了
-
最后一个问题(来自更新);是的,数组(尤其是字符)被称为缓冲区,但这与 I/O 缓冲不同,尽管 I/O 缓冲通常使用缓冲区来保存数据,直到数据被写入或读取。
-
为什么
getchar()来自stdin会刷新您的输出文件(顺便说一句,您还没有关闭)? -
如果标准输出被写入文件、管道或其他非交互设备,则标准 I/O 库在通过
getchar()读取新数据之前不会刷新它。只有当标准输出进入交互式设备时,实现才会(通常)在读取标准输入之前刷新标准输出。即使这样,如果数据已经在输入缓冲区中,它也可能不会刷新标准输出。不过,我相信这是实现定义的行为。