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

时间:2015-03-04 11:42:04

标签: c++ file-handling

我有以下代码段:

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之间的区别。

提前致谢!

1 个答案:

答案 0 :(得分:4)

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

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

另一方面,

std::ios::ate表示在打开后立即寻找流的末尾,因此保证返回文件的大小。

进一步阅读:C++ Filehandling: Difference between ios:app and ios:ate?