C++ 删除位于 before/after 特定单词的文本文件中的所有内容

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

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

kasjdfhjkasdhfjkasdhfjasfjs
asdjkfhasj
开始
sdfjkhasdkjfhasjkdfhajksdfhjkasdfh
asdjfhajs
结束
sdjfhsjkdf

如何删除单词 "start" 之前的所有内容和 "end" 之后的所有内容?

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

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

所以,最好从一个文件读取并写入另一个文件,这很简单:

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';
}

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

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

在符合 POSIX 的系统上(例如 Linux、BSD、MacOS X):

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

...或查看 Boost.Filesystem 的便携式解决方案。

重命名通常是文件系统的原子操作,因此您将始终拥有转换之前或之后的状态,如果排泄物击中风扇,您将能够修复它而无需太麻烦了