如何用fstream将文件指针移至文件开头并写入字符?
在文件开头写入字符的问题解决
我明白你遇到的麻烦了——想用seekp把指针移到文件开头写入字符,结果用ios::app模式时不管怎么seek都还是追加到末尾,去掉ios::app用ios::out又会把原有内容全清掉,确实挺头疼的。
先给你解释下为什么会这样:
- 当你用
ios::app打开文件时,C++标准有明确规定:所有输出操作执行前,都会自动把文件指针移到文件末尾。所以哪怕你手动调用了seekp(0, ios::beg),当你执行put(ch)的时候,指针还是会被强制移到末尾,字符自然就写到最后了。 - 而单独用
ios::out打开文件时,默认行为就是截断文件(把原有内容全部清空),所以写入前文件就已经是空的了,这显然不是你想要的。
那怎么实现“在文件开头插入字符,同时保留原有内容”呢?这里有个可行的方案:用ios::in | ios::out模式打开文件,先把原有内容全部读出来,然后在开头写入新字符,再把原有内容追加到后面。示例代码如下:
#include <fstream> #include <string> int main() { std::fstream ofile("test.txt", std::ios::in | std::ios::out); // 处理文件不存在的情况:先创建空文件再打开 if (!ofile.is_open()) { std::ofstream create_file("test.txt"); create_file.close(); ofile.open("test.txt", std::ios::in | std::ios::out); } // 读取文件原有全部内容 std::string content; ofile.seekg(0, std::ios::end); // 移到文件末尾获取大小 content.resize(ofile.tellg()); ofile.seekg(0); // 移回开头读取内容 ofile.read(&content[0], content.size()); // 移到文件开头写入新字符 ofile.seekp(0, std::ios::beg); ofile.put('g'); // 把原有内容写回文件 ofile.write(content.c_str(), content.size()); ofile.close(); return 0; }
如果你的需求只是覆盖文件开头的第一个字符(而不是插入),那可以更简单:直接用ios::in | ios::out打开,然后seekp(0, ios::beg)后执行put(ch),这样只会替换掉文件的第一个字符,后面的内容都会保留。代码如下:
#include <fstream> int main() { std::fstream ofile("test.txt", std::ios::in | std::ios::out); if (!ofile.is_open()) { // 处理文件不存在的情况 return 1; } char ch = 'g'; ofile.seekp(0, std::ios::beg); ofile.put(ch); ofile.close(); return 0; }
这样就能满足你的需求啦~
内容的提问来源于stack exchange,提问作者Idaisa
相关产品推荐
相关产品推荐

