我有以下代码段:
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::app
或ios::ate
时,line 1
的输出为0,但只有当它们在一起时,它们才会提供正确的文件位置。为什么会这样?
附:我知道ios :: app和ios :: ate之间的区别。
提前致谢!
答案 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?