使用fstream从文本文件中删除最后一行

Delete last line from text file using fstream

本文关键字:一行 最后 删除 fstream 文本 文件 使用      更新时间:2023-10-16

我想从存储在我的data.txt文件中的一些文本中删除最后一行("%12345")

谁能告诉我怎样才能达到我想要的?抱歉,我还没有密码。如果你能给我一些例子,我真的很感激。

data.txt :

Lorem Ipsum只是印刷和排版行业的虚拟文本。自16世纪以来,Lorem Ipsum一直是行业标准的虚拟文本,当一个不知名的印刷厂拿了一份印刷厂的活字,并把它搅乱成一个活字标本书。它不仅存活了五个世纪,而且还经历了跨入电子时代的飞跃排版,基本保持不变。它在20世纪60年代流行起来发布了包含Lorem Ipsum段落的小册子,以及最近的桌面出版软件,如Aldus PageMaker,包括Lorem Ipsum版本。
% 12345

#include <iostream.h>
#include <fstream.h>
main()
{
     char search[500];
     ifstream inFile;
     ofstream outFile;
     inFile.open("data.txt");
     while(!inFile.eof())
     {
          inFile.getline(search,500);
          outFile.open("data.txt");
          outFile.seekp(0,ios::end); //Seek to the end of text file
          //I don't know what to do here to delete last line????            
          outFile.close();
     }
     inFile.close();
     return 0;
}

如果您希望代码100%可移植,那么您所能做的就是读取所有文本,然后逐行复制,省略最后一行。如果实际文件和问题中的示例一样小,那么您也可以这样做。

如果文件很大,你不关心绝对的可移植性,你可以很容易地找到一个点,比如距离末尾4kb,然后从那里开始读取。当您找出最后一行开始的位置时,使用特定于平台的方法将文件截断到该点(在Windows上是SetEndOfFile,在UNIX上查找到正确的点并执行零长度写入,等等)

就你的代码而言,至少如果你试图用一个相当现代的c++编译器来做这件事,你可能需要扔掉那些代码,重新开始。我知道这听起来很残酷,我真的很抱歉,但在这种情况下,这是真的。让我们从标头开始——<iostream.h><fstream.h>自20世纪90年代中期以来就已经过时了,大约几十年前。大多数现代编译器会仅基于这一点直接拒绝该代码。

从这里开始,读取数据的代码几乎在所有方面都存在致命缺陷。您正在使用的std::getline的形式在技术上仍然包含在c++中,但是自从它被经常使用到足以引起注意以来,已经有十年了。您几乎总是希望使用带有std::string参数的表单。你的循环条件(while(!inFile.eof()))也完全被破坏了——它几乎不能正常工作。

至于我怎么做,我可能会按照这个一般顺序做:

read a line into `prev_line`
while (read a line into `current_line`) {
    write out prev_line
    prev_line = current_line
}