1

我正在阅读带有 QTextStream 的 QFile。

QFile file("example.txt");
QTextStream in(&file);
QString line = in.readLine();
while (!line.isNull()) {
 if(line.contains("DELETE"))
 {
   // delete line
 }
 line = in.readLine();
}

有没有办法删除一行?

4

3 回答 3

5

您可以打开文件、读取内容、修改内容,然后将它们写回文件。这是执行此操作的一种方法:

QFile f("myfile.txt");
if(f.open(QIODevice::ReadWrite | QIODevice::Text))
{
    QString s;
    QTextStream t(&f);
    while(!t.atEnd())
    {
        QString line = t.readLine();
        if(!line.contains("DELETE"))
            s.append(line + "\n");
    }
    f.resize(0);
    t << s;
    f.close();
}
于 2013-10-28T10:58:50.273 回答
0

据我所知,事情并没有那么简单。我能想到的最佳解决方案是逐行读取整个文件,将每一行推入 QVector,然后根据需要修改容器的元素,然后将其推回文件。

于 2013-10-28T09:46:48.007 回答
0

删除一行意味着将所有其余部分向后移动。

最简单的方法是在第一次删除后在新位置写回行。

使用临时文件,如果成功,将其重命名为原始文件,是最安全的方法。

但是你写的永远不会比你读的多,所以在同一个文件上工作应该是可以的。

您需要保持读取位置和写入位置。

它应该是这样的:(基于原始代码)

QFile file("example.txt");
QTextStream in(&file,QIODevice::ReadWrite);
QString line = in.readLine();
qint64 rpos,wpos=0;
bool shift = false;
while (!line.isNull()) {
 rpos = in.pos(); 
 if(!line.contains("DELETE"))
 {
   if(shift){
     in.seek(wpos);
     in<<line<<endl;
     wpos = in.pos(); 
     in.seek(rpos);
   } else{
     wpos = rpos;
   }
 }else{
   shift = true;
 }
 in.seek(rpos); 
 line = in.readLine();
}
file.resize(wpos);
于 2013-10-28T10:25:59.583 回答