Qt从文件中删除一行

时间:2013-10-28 09:38:59

标签: c++ qt file-io

我正在使用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();
}

有没有办法删除一行?

3 个答案:

答案 0 :(得分: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();
}

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

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

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

但是你从来没有写过更多的内容,所以你认为可以在同一个文件上工作。

你需要保持阅读pos并写pos。

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

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);