流缓冲区中的默认内容

the default contents in the buffer of a stream

本文关键字:默认 缓冲区      更新时间:2023-10-16

我对这两段稍微不同的代码的结果有点困惑:

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

怪事发生了。当我关闭程序时,我的test.txt中出现了2800 c579 7a之类的东西。

然后我试着改变一下缓冲区,像这样:

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

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

我认为你想用''终止你的缓冲区。看一下

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

检查在程序末尾添加一个fclose,这将确保强制执行fflush并且流被干净地关闭,同时避免上面提到的错误。