> 文档中心 > QT 删除文件中的某一行数据

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