我有以下代码片段:
ofile.open("New1.dat",ios::app|ios::binary|ios::ate);
long bytes = ofile.tellp()/sizeof(t);
cout<<ofile.tellp()<<endl; //line 1
t.input(bytes);
ofile.write((char *)&t,sizeof(t));
ofile.close();
Run Code Online (Sandbox Code Playgroud)
当我删除ios::appor时ios::ate, 的输出line 1为 0,但是只有当它们都在一起时,它们才会给出正确的文件位置。为什么会出现这种情况?PS 我知道 ios::app 和 ios::ate 之间的区别。
提前致谢!
来自std::ios::openmode(C++11 第 27.5.3.1.4 节)
std::ios::app表示在每次写入之前查找流的末尾。因此,在任何写入操作之前,流可能尚未结束。无论指针在哪里(0或其他地方),写入总是在末尾完成。(隐式寻道在每次写操作之前结束)
另一方面std::ios::ate意味着在打开后立即查找流的末尾,从而保证返回文件的大小。
进一步阅读:C++ 文件处理:ios:app 和 ios:ate 之间的区别?