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

时间:2015-01-20 13:54:42

标签: c++ visual-c++ text-files

所以我们说文本文件包含以下内容:

kasjdfhjkasdhfjkasdhfjasfjs
asdjkfhasj
开始
sdfjkhasdkjfhasjkdfhajksdfhjkasdfh
asdjfhajs

sdjfhsjkdf

如何在单词" start"之前删除所有内容。 "结束"?

之后的所有事情

2 个答案:

答案 0 :(得分:1)

文件系统通常支持"截断"意思是切断结束,但他们不支持删除文件的正面。因此,您只剩下一个选项:您需要在" start"之间移动内容。和"结束"到文件的开头,然后"截断"其余的部分。如果您移动的部分非常大,这并不是非常有效,但在典型的文件系统上却没有办法解决这个问题。

答案 1 :(得分:0)

除非是非常具体的情况,否则编辑文件并不是一个好主意。例如,如果您的计算机在错误的时间点崩溃,您将导致文件损坏,并且无法在尝试转换之前恢复其状态。

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

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以获取便携式解决方案。

重命名通常是文件系统的原子操作,因此您在转换之前或之后始终处于状态,如果粪便撞击风扇,您将能够修复它没有太多麻烦。