示例:
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"