【发布时间】:2015-05-30 00:49:35
【问题描述】:
我对这样两段略有不同的代码的结果有点困惑:
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);
然后我在我的text.txt 中得到了00c5 797a。
所以我想知道这是否是我不知道的任何未定义行为或默认模式。
【问题讨论】:
-
setbuf 要求缓冲区的大小为 BUFSIZ 字节(如果传递 NULL,则为 0 字节,在这种情况下,流将无缓冲) .因此,由于您的示例具有未定义的行为,因此任何事情都可能发生。
-
@ooga 不。我试过了(使用最新的例子)。
printf("%d",sizeof(buffer))给我 5 和printf("%d",sizeof(BUFSIZ))给我 4(虽然我不知道为什么是 4)。也许你应该在你的机器上试试。 -
您不想打印
sizeof(BUFSIZ)。因为它是int,所以在 32 位机器上它将是 4 个字节,但这并不重要。只需打印BUFSIZ本身。至少是 256。 -
@ooga 哦,你是对的。我的错。谢谢。