c中stdout的缓冲行为

时间:2012-07-05 07:18:41

标签: c stdio output-buffering

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

3 个答案:

答案 0 :(得分:4)

我不认为getchar与您在第一段代码中观察到的缓冲有任何关系。如果你不按任何字符并等待一段时间(即留在getchar()内),你很可能会看到一个空文件。无论您是使用getcharsleep还是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的数据通常会立即显示。