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

C++删除文本文件中位于特定单词之前/之后的所有内容,c++,visual-c++,text-files,C++,Visual C++,Text Files,假设文本文件包含以下内容: kasjdfhjkasdhfjkasdhfjasfjs Asdjkfasj 开始 sdfjkhasdkjfhasjkdfhajksdfhjkasdfh asdjfhajs 终止 sdjfhsjkdf 如何删除单词开始前的所有内容和结束后的所有内容?文件系统通常支持截断(truncate)意思,即删除文件的结尾,但不支持删除文件的前面部分。因此,您只剩下一个选项:您需要将开始和结束之间的内容移动到文件的开头,然后截断其余内容。如果要移动的部件非常大,则这不是非常有效,但

假设文本文件包含以下内容:

kasjdfhjkasdhfjkasdhfjasfjs Asdjkfasj 开始 sdfjkhasdkjfhasjkdfhajksdfhjkasdfh asdjfhajs 终止 sdjfhsjkdf


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

文件系统通常支持截断(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';
}
在符合POSIX标准的系统上,如Linux、BSD、MacOS X:

rename("output.txt", "input.txt");
…或者看看Boost.Filesystem,它是一个可移植的解决方案


重命名通常是文件系统的原子操作,所以在任何时候都会有转换的状态,如果粪便中的东西碰到风扇,你就可以修复它,而不会太麻烦。

显示你自己的一些研究工作。这和C++相关吗?如果您使用的是类Unix系统,最简单的方法是使用awk和sed等工具。@Baum mit Augen我没有找到任何关于我所说的内容的研究,所有内容都是关于删除特定的单词或行,但不是关于这样的事情。@Aaron McDaid我在Windows上工作一切正常,但如果单词开始和结束结合在一起呢其他标记为1行,中间不带空格,例如,如此行:TestStartTestEndAlways在同一行上,或标记之间可能有换行符?始终在同一行Std::size_t startpos=s.findstart_标记;std::size\u t endpos=s.findend\u令牌;ifendpos!=std::string::npos&&startpos+start_token.sizerename("output.txt", "input.txt");