如何在文件开头写入内容且不覆盖原有文本?
在文件开头写入新内容的解决方案
fstream::app(追加模式)的特性就是强制将写入位置定位到文件末尾,所以没法直接用它在文件开头插入内容。要实现需求,得通过以下两种常见方式:
方法一:内存中转(适合小文件)
先把原文件的全部内容读到内存里,再以覆盖模式打开文件,先写入新文本,再追加原内容:
#include <fstream> #include <string> #include <sstream> int main() { // 读取原文件内容到内存 std::ifstream in("file.txt"); std::stringstream contentBuf; contentBuf << in.rdbuf(); std::string originalContent = contentBuf.str(); in.close(); // 写入新内容+原内容 std::ofstream out("file.txt"); if (out.is_open()) { out << "new text\n" << originalContent; out.close(); } return 0; }
方法二:临时文件中转(适合大文件)
如果文件太大,全部读进内存占用过高,可以用临时文件过渡:
- 创建临时文件,先写入新文本
- 把原文件的内容逐行(或逐块)复制到临时文件
- 删除原文件,将临时文件重命名为原文件名
示例代码(简化版):
#include <fstream> #include <string> #include <cstdio> // 用于remove和rename int main() { // 创建临时文件并写入新内容 std::ofstream tempOut("temp_file.txt"); tempOut << "new text\n"; tempOut.close(); // 复制原文件内容到临时文件 std::ifstream in("file.txt"); std::ofstream tempAppend("temp_file.txt", std::ios::app); std::string line; while (std::getline(in, line)) { tempAppend << line << "\n"; } in.close(); tempAppend.close(); // 替换原文件 std::remove("file.txt"); std::rename("temp_file.txt", "file.txt"); return 0; }
注意:处理大文件时,逐块读写比逐行更高效;另外要做好异常处理,比如文件打开失败、重命名失败等情况。
内容的提问来源于stack exchange,提问作者Faizan_u_Haq
相关产品推荐
相关产品推荐

