算法思想:
有时候需要在程序中读入一个文件,并且获取特定位置的内容,这样就需要有能够在文件内容中定位的函数,如果已经知道内容的位置,做起来可能会比较容易。但是对于随意存储式的文件来说,我们并不能规定存储内容的大小,否则就给存储带来了一定的局限性。
一种比较简单的实现方法是:利用一个简单的标记如“[XX]”等等,来标记特定位置的内容。这样当我们需要定位特定内容的时候就可以根据标记的内容来定位了。定位标记的程度可以根据需要调整。
算法实现:
QString Algorithm::locateSring(QChar flag, QString fileStr) //flag是标记内容(这里使用一位标记), fileStr是读出的文件内容,
{ 被定义为QString类
if(fileStr.endsWith(";end")) //";end"使用来识别文件完结与否的标志,可以不要
{
int filestrsize = fileStr.size(); //.size()函数用于返回文件内容,即fileStr的长度
fileStr.resize(filestrsize); //.resize()用于把fileStr分割为filestrsize个字符,即形成fileStr数组
for(int i=0; i<=filestrsize; i++) //搜索主循环,用于保证程序能够完整的搜索文件内容
{
if(fileStr[i] == '[') //定位标记左端
{
int ia = 0;
int ib = 0;
QChar tmpChar;
tmpChar = fileStr[i+1];
if(tmpChar == flag) //检查标记内容是否符合
{
ia = i+3; //记录目标内容的开头在fileStr数组中的位置
for(int j=ia; j<=filestrsize; j++)
{
if((fileStr[j] == '[') || (fileStr[j] == ';')) //当当前标记内容符合时搜索下一个标记左端,以明确内容长度
{
ib = j-1; //标记目标内容尾部在fileStr数组中的位置
break;
}
}
if(ib<ia)
{
return "Erro!"; //防止内容长度为负数
}
QChar field[ib-ia];
for(int i=0; i<=ib-ia; i++) //将所得目标内容重新复制
{
field[i] = fileStr[ia+i];
}
QString fieldStr(field, ib-ia+1); //将数组转换为QString类
return fieldStr; //返回值
}//if()
}//if()
}for()
return "OK!";
}//if()
else
{
return "Erro!";
}
}
算法说明:
该算法还没经过优化,可能存在效率和逻辑上的BUG。另外,使用Qt4来实现主要表现了一种实现形式,并不一定通用。