当我运行第一个代码并立即按下ctrl-c时,不会向文件写出45
。但是当我运行第二个代码时,我会得到45
。
我无法理解为什么在下面的代码中发生这种行为?如果stdout
是行缓冲的,那么输入字符后输出不应该输出吗?我错过了什么?
第一个代码:
#include<stdio.h>
#include<stdlib.h>
int main()
{
FILE *fp=stdout;
fp=fopen("myfile","w");
fprintf(fp,"%d",45);
getchar();
// return 0;
}
第二个代码:
#include<stdio.h>
#include<stdlib.h>
int main()
{
FILE *fp=stdout;
fprintf(fp,"%d",45);
getchar();
// return 0;
}
PS:我正在使用GCC,平台是Linux。
答案 0 :(得分:4)
我不认为getchar
与您在第一段代码中观察到的缓冲有任何关系。如果你不按任何字符并等待一段时间(即留在getchar()
内),你很可能会看到一个空文件。无论您是使用getchar
,sleep
还是while(1)
停止了该计划,都会发生这种情况。
现在你按Ctrl-C
,你的程序没有注册处理程序,因此你的程序突然终止。 是否在突然的程序终止时刷新缓冲区/流是实现定义的 。阅读完整的故事
Why is data not being flushed to file on process exit?
例如,在我的系统上(Windows 7,内部使用gcc和mingw框架的代码块),我可以看到45
确实被刷新到文件中,无论我使用getchar
还是其他任何东西突然终止它。即在我的系统上,实现是在突然程序终止时将数据刷新到文件中。
所以,最重要的是,当您以非正常方式执行操作时会发生什么实现!
但第二种情况确实是一种奇怪的情况,其中getchar
似乎正在刷新stdout
缓冲区。一旦找到getchar
为/ {似乎 - 正在刷新stdout
缓冲区
答案 1 :(得分:0)
造成混淆的是 getchar(),好像被称为冲洗 stdout 。
如果用getchar()
之类的内容替换sleep(10)
,则不会打印出来。
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
int main()
{
FILE *fp=stdout;
//fp=fopen("myfile","w");
fprintf(fp,"%d",45);
sleep(10);
//getchar();
// return 0;
}
答案 2 :(得分:-4)
您要写入物理文件的第一种情况。 fopen,fclose是缓冲I / O取决于实现,数据可能不会立即提交,直到缓冲区已满。调用fclose()将导致缓冲区写入磁盘。
您正在写入STDIO的第二种情况和写入STDIO的数据通常会立即显示。