2013-10-28 143 views
0

我正在用QTextStream讀取QFile。Qt從文件中刪除一行

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

有沒有辦法刪除一行?

+0

最簡單的方法是創建一個新文件並在其中寫入必要的字符串。 –

+0

截斷?什麼文件內容? – CapelliC

回答

4

你可以打開你的文件,讀取內容,修改的內容,然後將它們寫回文件。這是一種方法:

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(); 
} 
0

據我所知,這並不簡單。我能想到的最佳解決方案是逐行讀取整個文件,將每行都推送到QVector中,然後根據需要修改容器的元素,然後將其推回到文件中。

+0

對於這樣的事情,最好使用像QList或QLinkedList這樣的容器。 –

+1

有QStringList –

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