流缓冲区中的默认内容
the default contents in the buffer of a stream
我对这两段稍微不同的代码的结果有点困惑:
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并且流被干净地关闭,同时避免上面提到的错误。
相关文章:
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- C++字符*缓冲区的大小
- 如何使用默认参数等选择模板专业化
- 具有默认模板参数的多态类的模板推导失败
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 为什么msgrcv()将垃圾字符馈送到缓冲区
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- ostream过载时的缓冲区冲洗
- 当函数模板参数是具有默认参数的类模板时,函数模板参数的推导如何执行
- C++中的高效循环缓冲区,它将被传递给C样式数组函数参数
- 初始化具有非默认构造函数的std::数组项的更好方法
- 何时提供默认参数作为模板参数
- DirectX 顶点缓冲区默认与默认 + 暂存
- libstdc++ 中的默认缓冲区大小为 basic_filebuf
- 是否可以仅使用OpenGL来确定默认帧缓冲区的大小
- 将FBO混合到默认帧缓冲区上
- 延迟渲染:使用默认framebuffer中Gbuffer的深度缓冲区
- 是否有可能在Windows 7中抓取指向默认音频端点设备缓冲区的指针?
- 对stdout的默认缓冲区大小感到困惑
- 流缓冲区中的默认内容