为什么append模式下seekp与tellp行为异常?如何实现行尾追加额外值?
现象原因
std::ios::app模式下seekp不生效是完全符合C标准的预期行为。
C标准明确规定:使用std::ios::app打开输出流时,所有写入操作都会被强制追加到文件末尾,无论当前文件指针被seekp设置到什么位置,写入前流都会自动将指针重置到文件结尾,因此回退指针覆盖换行符的操作不会生效。
兼容方案
你提到的std::ios::ate | std::ios::in打开方式是正确解法,两个标识的核心作用如下:
std::ios::ate:仅在打开文件的瞬间将指针定位到文件末尾,之后指针可以被seekp自由移动,写入位置完全由当前指针位置决定,不会像app模式一样强制跳转- 搭配
std::ios::in的原因是避免ofstream默认打开时清空原有文件内容,同时保留写入权限
通用兼容实现代码
#include <iostream> #include <fstream> int main(){ long long opos; std::ofstream outfile; // 新建文件场景 outfile.open("outfile.dat"); outfile << "1\t2\t3" << std::endl; opos = outfile.tellp(); outfile.seekp(opos - 1); outfile << "\t4" << std::endl; outfile.close(); // 已有文件追加修改场景,替换原std::ios::app模式 outfile.open("outfile.dat", std::ios::ate | std::ios::in); outfile << "1\t2\t3" << std::endl; opos = outfile.tellp(); outfile.seekp(opos - 1); outfile << "\t4" << std::endl; outfile.close(); return 0; }
运行后文件输出符合预期:
1 2 3 4 1 2 3 4
内容的提问来源于stack exchange,提问作者Botond
相关产品推荐
相关产品推荐

