【问题标题】:the default contents in the buffer of a stream流缓冲区中的默认内容
【发布时间】: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 哦,你是对的。我的错。谢谢。

标签: c++ c stream buffer


【解决方案1】:

我认为你想用 '\0' 来终止你的缓冲区。检查一下。

如果您没有调用 fclose,则可能是由于 setbuf 导致的未定义行为问题,请参阅http://man7.org/linux/man-pages/man3/setbuf.3.html

检查在程序末尾添加 fclose,这将确保强制执行 fflush 并干净地关闭流,同时避免上述错误。

【讨论】:

  • 如果将 5 个 个字符的字符串固定为 6 个 个字符长的数组,默认情况下它不会被 '\0' 终止?(我试过了,还是一样)
  • 为什么该页面中的示例无效?
  • 我不知道究竟是为什么,但这似乎是缓冲区在缓冲区之后被无效、释放或关闭的情况,导致未定义的行为。
  • 我已经把它作为一个问题发布在 http://stackoverflow.com/questions/30541589/a-valid-program-being-declared-as-invalid-by-man7-org。如果您有任何兴趣。
  • 谢谢,希望能帮到你。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-27
  • 2013-06-03
  • 1970-01-01
  • 2012-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多