QT 删除文件中的某一行数据
示例:
deleteOnelineInFile(1,"./test");//参数,第几行(从0开始数),文件名
完整代码示例:
void ResManageObject::deleteOnelineInFile(int iNumLine, const QString sFilename){ QString sTemp; QFile f(sFilename); if(f.open(QIODevice::ReadWrite)) { QTextStream in(&f); sTemp=in.readAll();//注:这里读出来的字符串每行后面都有个隐藏的转行符\n,qDebug打印出来的时候看不出来,只是换行了,后续我们就是根据这个转行符来进行判断删除的 } f.close(); DeleteOneline(iNumLine,sTemp); QFile writeFile(sFilename); if(writeFile.open(QIODevice::WriteOnly)) { QTextStream wrtStream(&writeFile); wrtStream<<sTemp; } writeFile.close();}
void ResManageObject::DeleteOneline(int iNum, QString &str){ int iAllLine=0; int index=0; //算出行数iAllLine while(index!=-1) { index=str.indexOf('\n',index+1); iAllLine++; } //如果是直接从位置0开始删除,\n算一个字符,比如要删除的一行有3个字母,加上转行符就是3+1,也就是index+1 if(iNum==0) { int iPreIndex=str.indexOf('\n'); str.remove(0,iPreIndex+1); } else { int iTemp=iNum; int iPreIndex=0,iNextIndex=0; //计算出要删除行的前一个转行符iPreIndex的位置及后一个转行符iNextIndex的位置 while(iTemp--) { iPreIndex=str.indexOf('\n',iPreIndex+1); if(iPreIndex!=-1) { iNextIndex=str.indexOf('\n',iPreIndex+1); } } //删除的行不是最后一行(从iPreIndex+1这个位置起iNextIndex-iPreIndex个字符全部抹去) if(iNum<iAllLine-1) { str.remove(iPreIndex+1, iNextIndex-iPreIndex);//不用减一 } //删除的是最后一行(从iPreIndex起始len-iPreIndex个字符全抹去) else if(iNum==iAllLine-1) { int len=str.length(); str.remove(iPreIndex+1,len-iPreIndex); /*注:这里一定要加1,不然你试试从1一直删除, 然后再多删几次之后,换成删除第0行, 你会发现删不掉了文件中的第一行数据了*/ } }}
补充说明:
一、如果想查明一个字符串是否包含一个特定的字符、子串、或正则表达式,可以使用QString中的indexOf()函数,函数原型如下:
int QString::indexOf ( const QString & str, int from = 0, Qt::CaseSensitivity cs = Qt::CaseSensitive ) const
示例:第一个出参数是要查找的内容,第二个参数是查找的起始位置,从0开始数。
QString x = "sticky question"; QString y = "sti"; x.indexOf(y); // returns 0 x.indexOf(y, 1); // returns 10 x.indexOf(y, 10); // returns 10 x.indexOf(y, 11); // returns -1
二、删除字符串中的内容用remove(i,n),表示从第几个位置(从0开始数)开始删除n个字符(从1开始数)。
QString s = "Montreal"; s.remove(1, 4); // s == "Meal"
感言:总觉得这样先读,删,后重写的方法来修改文件中的某行内容很麻烦,但是我又没找到其他比较简便的方法,QAQ