我正在阅读带有 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();
}
有没有办法删除一行?
您可以打开文件、读取内容、修改内容,然后将它们写回文件。这是执行此操作的一种方法:
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();
}
据我所知,事情并没有那么简单。我能想到的最佳解决方案是逐行读取整个文件,将每一行推入 QVector,然后根据需要修改容器的元素,然后将其推回文件。
删除一行意味着将所有其余部分向后移动。
最简单的方法是在第一次删除后在新位置写回行。
使用临时文件,如果成功,将其重命名为原始文件,是最安全的方法。
但是你写的永远不会比你读的多,所以在同一个文件上工作应该是可以的。
您需要保持读取位置和写入位置。
它应该是这样的:(基于原始代码)
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);