3

当我运行第一个代码并立即按 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。

4

3 回答 3

4

我认为getchar与您在第一个代码中观察到的缓冲没有任何关系。如果您不按任何字符并等待一段时间(即留在里面getchar()),您很可能会看到一个空文件。无论您是否使用或停止了程序getchar,都会发生这种情况。sleepwhile(1)

现在你按下Ctrl-C你的程序没有注册的处理程序,因此你的程序突然终止。是否在程序突然终止时刷新缓冲区/流是实现定义的。在这里阅读完整的故事

为什么在进程退出时数据没有被刷新到文件中?

例如,在我的系统(Windows 7,内部使用 gcc 和 mingw 框架的代码块)上,当我突然终止它时,我可以看到45确实被刷新到文件中,而不管使用或任何东西。getchar即在我的系统上,实现是在程序突然终止时将数据刷新到文件中。

所以,底线是,当你以非正常方式做事时会发生什么是实现定义的!

但第二种情况确实是一种奇怪的情况,getchar 似乎正在刷新stdout缓冲区。一旦我找到为什么getchar是/似乎是刷新stdout缓冲区的确切原因,我将立即更新

于 2012-07-05T07:37:50.717 回答
0

引起混淆的是getchar(),似乎当它被调用时它正在刷新stdout

如果你getchar()用类似的东西替换,sleep(10)那么你 45 将不会被打印出来。

#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;

}
于 2012-07-05T07:27:31.827 回答
-4

您正在写入物理文件的第一种情况。fopen, fclose 是缓冲 I/O 取决于实现,数据可能不会立即提交,直到缓冲区已满。调用 fclose() 将导致缓冲区写入磁盘。

您正在写入 STDIO 的第二种情况,写入 STDIO 的数据通常会立即显示。

于 2012-07-05T07:30:28.943 回答