时间:2015-05-30 00:49:35

标签: c++ c stream buffer

我对这两个略有不同的代码的结果有点困惑:

FILE* file=fopen("test.txt","w");
char buffer[6]="hello";
char arr[6]="haloo";

//setbuf(file,buffer);
fputs(arr,file);
//fflush(file);

正如您所看到的,我首先注释掉了两行代码。因此,在关闭程序之前不会刷新缓冲区,此时文件流也将被关闭。然后,正如我所期望的那样,一旦我关闭程序,程序就会将haloo写入test.txt。当我没有注释掉这两行时,同样的事情发生了。像这样:

setbuf(file,buffer);
fputs(arr,file);
fflush(file);

但是,当我只注释掉flush(file)代码行时,就像这样:

setbuf(file,buffer);
fputs(arr,file);
//fflushed(file);
奇怪的事情发生了。当我关闭我的程序时,我在2800 c579 7a中得到了类似test.txt的内容。

然后我尝试稍微更改缓冲区,如下所示:

char buffer[5]="hell";   //change the contents a little bit
char arr[5]="halo";      // also change a little bit

setbuf(file,buffer);
fputs(arr,file);
//fflush(file);

然后我在00c5 797a中获得text.txt

所以我想知道这是否是我不知道的任何未定义的行为或默认模式。

1 个答案:

答案 0 :(得分:1)

我认为您希望使用' \ 0'来终止缓冲区。检查一下。

如果你没有调用fclose,可能会因为setbuf而出现未定义的行为问题,请参阅http://man7.org/linux/man-pages/man3/setbuf.3.html

检查在程序结束时添加fclose,这将确保强制执行fflush并且流被完全关闭,同时避免上述错误。