为什么tellp()对ios:app返回0,而对ios:ate不返回

Why does tellp() return 0 for ios::app but not for ios::ate?

本文关键字:返回 ios 而对 ate tellp 为什么 app      更新时间:2023-10-16

我有以下代码片段:

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

当我删除ios::appios::ate时,line 1的输出为0,但只有当它们都在一起时,它们才会给出正确的文件位置。为什么会发生这种情况?附言:我知道ios:app和ios:ate之间的区别。

提前感谢!

来自std::ios::openmode(C++11第27.5.3.1.4节)

std::ios::app意味着在每次写入之前寻找流的末尾。因此,流可能不在任何写操作之前的末尾。无论指针在哪里(0或其他地方),写入总是在末尾完成。(每次写入操作前隐式查找结束)

CCD_ 6意味着在打开之后立即寻找流的末尾,从而保证返回文件的大小。

进一步阅读:C++文件处理:ios:app和ios:ate之间的区别?