如何使用C++删除文本文件中的指定行?
解决文本文件指定行删除的问题
直接在原文件中删除某一行并不容易——因为文件系统的流式存储特性,没法直接修改中间的内容。常用的可靠做法是:把需要保留的内容写入临时文件,之后用临时文件替换原文件。
先指出你原代码里的几个问题:
- 全局的
std::fstream对象用ios::app | ios::in | ios::out打开,ios::app会强制所有写入操作追加到文件末尾,完全不符合修改文件内容的场景; while (file.good())的判断逻辑有缺陷,应该直接用getline(file, line)作为循环条件,这样能正确处理读取结束的情况。
以下是修改后的完整代码,实现了删除指定行的功能:
#include <iostream> #include <fstream> #include <string> #include <cstdio> // 用于remove和rename函数 int main() { std::string line; int number; std::cout << "Enter the number: "; std::cin >> number; std::string target = std::to_string(number); // 打开原文件和临时文件 std::ifstream inFile("havai.txt"); std::ofstream outFile("havai_temp.txt"); if (!inFile.is_open() || !outFile.is_open()) { std::cerr << "Failed to open files!" << std::endl; return 1; } // 遍历每一行,保留不需要删除的行 while (getline(inFile, line)) { if (line != target) { outFile << line << std::endl; } } // 关闭文件 inFile.close(); outFile.close(); // 删除原文件,将临时文件重命名为原文件名 if (std::remove("havai.txt") != 0) { std::cerr << "Failed to delete original file!" << std::endl; return 1; } if (std::rename("havai_temp.txt", "havai.txt") != 0) { std::cerr << "Failed to rename temp file!" << std::endl; return 1; } std::cout << "Line deleted successfully!" << std::endl; return 0; }
代码说明:
- 用
std::ifstream只读打开原文件,std::ofstream只写打开临时文件,规避了原打开方式的问题; - 循环读取每一行,只有当该行不等于目标内容时,才写入临时文件;
- 操作完成后,关闭两个文件,删除原文件,再把临时文件改名为原文件的名字,完成替换;
- 加入了文件打开、删除、重命名的错误判断,避免出现异常情况。
内容的提问来源于stack exchange,提问作者Gevv
相关产品推荐
相关产品推荐

