视觉C++删除文本文件中位于特定单词之前/之后的所有内容

visual C++ delete everything in text file that is located before/after a specific word

本文关键字:之后 单词之 文本 删除 C++ 文件 于特定 视觉      更新时间:2023-10-16

所以假设文本文件具有以下内容:

kasjdfhjkasdhfjkasdhfjasfjs
Asdjkfhasj
开始
sdfjkhasdkjfhasjkdfhajksdfhjkasdfh
Asdjfhajs
结束
sdjfhsjkdf

如何删除"开始"一词之前的所有内容和"结束"之后的所有内容?

文件系统通常支持"截断"的意思是切断结尾,但它们不支持删除文件的前面。 所以你只剩下一个选择:你需要将"开始"和"结束"之间的内容移动到文件的开头,然后"截断"其余部分。 如果您要移动的部分非常大,这不是很有效,但在典型的文件系统上没有办法绕过它。

除非非常特殊的情况,否则就地编辑文件不是一个好主意。例如,如果您的计算机在错误的时间点崩溃,您最终会得到一个损坏的文件,并且无法在尝试转换之前恢复其状态。

因此,最好从一个文件读取并写入另一个文件,这非常简单:

std::ifstream in ("input.txt");
std::ofstream out("output.txt");
std::string line;
// read and discard lines before "start"
while(std::getline(in, line) && line != "start");
// read and echo lines until "end"
while(std::getline(in, line) && line != "end") {
  out << line << 'n';
}

然后将其移动到原始文件所在的位置,覆盖它。在视窗上:

MoveFileExA("output.txt", "input.txt", MOVEFILE_REPLACE_EXISTING);

在符合POSIX标准的系统(如Linux,BSD,MacOS X)上:

rename("output.txt", "input.txt");

。或者查看 Boost.Filesystem 获取便携式解决方案。

重命名通常是文件系统的原子操作,因此您将始终具有转换之前或之后的状态,如果粪便物质击中风扇,您将能够轻松修复它。