基于QT实现WritePrivateProfileString和GetPrivateProfileString

来源:互联网 发布:姜文与李安 知乎 编辑:程序博客网 时间:2024/06/06 18:00

我用qt库写的两个静态方法,writePrivateProfileString功能比较全了,getPrivateProfileString功能只做了比较实用的。

//************************************
// Method:    WritePrivateProfileString
// Usage:   strValue是null则删除key,key是null则删除section,section是null直接返回。
// FullName:  MyClass::WritePrivateProfileString
// Access:    public
// Returns:   bool
// Parameter: QString strSectionName
// Parameter: QString strKeyName
// Parameter: QString strValue
// Parameter: QString strFileName
//************************************
bool MyClass::WritePrivateProfileString(QString strSectionName, QString strKeyName, QString strValue, QString strFileName)
{
 bool ret = false;

 //section是null则直接返回false
 if(strSectionName == NULL)
 {
  return ret;
 }

 bool flagFindSection = false;//是否找到了section
 int pos = 0;
 QString strSection("[" + strSectionName + "]");
 QString strKey(strKeyName + "=");

 //文件不存在,则创建,且直接写入
 if(!QFile::exists(strFileName))
 {
  QFile createFile(strFileName);
  if(!createFile.open(QFile::WriteOnly | QIODevice::Text))
  {
   return ret;
  }
  //如果key和value不是null,才写内容
  if(strKeyName != NULL && strValue != NULL)
  {
   QTextStream createStream(&createFile);
   createStream<<strSection<<"/n";
   createStream<<strKey<<strValue<<"/n";
   createStream.flush();

   ret = true;
  }
  createFile.close();
  return ret;
 }

 QFile readFile(strFileName);

 if (!readFile.open(QFile::ReadOnly | QIODevice::Text))
 {
  ret = false;
  return ret;
 }

 QFile writeFile(strFileName);
 
 //读入流和写入流
 //写入流文件在最后才WriteOnly打开
 QTextStream readStream(&readFile);
 QTextStream writeStream(&writeFile);
 
 //查找每一行是否包含section
 while (!readStream.atEnd())
 {
  QString line(readStream.readLine());
  
  if (line.indexOf(strSection) != 0) //该行不包含section,直接写入流
  {
   writeStream<<line<<"/n";
  }
  else  
  {
   flagFindSection = true; //查到section
   ret = true;

   //key是null,则跳过该section,写入其余section
   if (strKeyName == NULL)
   {
    do //跳过该section
    {
     line = QString(readStream.readLine());
    } while (line.indexOf("[") != 0 && !readStream.atEnd());
    
    if(readStream.atEnd())
    {
     break;
    }
    else //写入其余section
    {
     writeStream<<line<<"/n";
     while(!readStream.atEnd())
     {
      writeStream<<readStream.readLine()<<"/n";
     }
     break;
    }
   }
   
   writeStream<<line<<"/n";//section写入流
   line = QString(readStream.readLine());
   while(line.indexOf(strKey) != 0 && line.indexOf("[") != 0 && !readStream.atEnd())
   {
    writeStream<<line<<"/n";
    line = QString(readStream.readLine());
   }
   if(readStream.atEnd())//文件末尾,若value!=null则直接加上key
   {
    //直接加上
    if(strValue != NULL)
    {
     writeStream<<strKey<<strValue<<"/n";
    }
   }
   else if(line.indexOf("[") == 0)//查到下一个section,若value!=null则在下一个section前直接加上key
   {
    if(strValue != NULL)
    {
     writeStream<<strKey<<strValue<<"/n";
    }
    writeStream<<line<<"/n";
    while(!readStream.atEnd()) //剩余行写入流中
    {
     writeStream<<readStream.readLine()<<"/n";
    }
    break;
   }
   else if(line.indexOf(strKeyName) == 0)//查到key,若value!=null则修改value
   {
    if(strValue != NULL)
    {
     line = line.mid(0, line.indexOf("=") + 1) + strValue;
     writeStream<<line<<"/n";
    }
    while(!readStream.atEnd()) //剩余行写入流中
    {
     writeStream<<readStream.readLine()<<"/n";
    }
    break;
   }
  }
 }
 if(!flagFindSection)//若未查到该section,且key和value!=null,写入section和key=value
 {
  if(strKeyName != NULL && strValue != NULL)
  {
   writeStream<<strSection<<"/n";
   writeStream<<strKey<<strValue<<"/n";
  }
 }
 readFile.close();

 //写打开文件
 if (!writeFile.open(QFile::WriteOnly | QIODevice::Text))
 {
  ret = false;
  return ret;
 }
 writeStream.flush();//写入流到文件
 
 writeFile.close();

 return ret;
}


//************************************
// Method:    GetPrivateProfileString
// Usage:   strSectionName和strKeyName是null则pReturnedValue设为strDefault,若strDefault为null则设为""
// FullName:  MyClass::GetPrivateProfileString
// Access:    public
// Returns:   int。返回字符串长度(不包括'/0', <=size-1);若数组长度过小则同样返回size-1;
// Parameter: QString strSectionName
// Parameter: QString strKeyName
// Parameter: QString strDefault
// Parameter: char * pReturnedValue
// Parameter: int size
// Parameter: QString strFileName
//************************************
int MyClass::GetPrivateProfileString(QString strSectionName, QString strKeyName, QString strDefault, char * pReturnedValue, int size, QString strFileName)
{
 //设置默认返回字符串
 if(strDefault == NULL)
 {
  strDefault = "";
 }
 //文件不存在,返回默认字符串及其长度
 if (!QFile::exists(strFileName) || strSectionName == NULL || strKeyName == NULL)
 {
  return StrCopy(strDefault, pReturnedValue, size);
 }

 QString strSection("[" + strSectionName + "]");
 QString strKey(strKeyName + "=");

 QFile readFile(strFileName);

 //打开失败,返回默认字符串及其长度
 if (!readFile.open(QFile::ReadOnly | QIODevice::Text))
 {
  return StrCopy(strDefault, pReturnedValue, size);
 }
 
 QTextStream readStream(&readFile);

 while (!readStream.atEnd())
 {
  QString line(readStream.readLine());
  if(line.indexOf(strSection) == 0) //找到Section
  {
   line = readStream.readLine();
   while(line.indexOf(strKey) != 0 && line.indexOf("[") != 0 && !readStream.atEnd())
   {
    line = readStream.readLine();
   }
   if (line.indexOf(strKey) == 0) //找到Key
   {
    QString source(line.mid(strKey.length()));
    readFile.close();
    return StrCopy(source, pReturnedValue, size);
   }
  }
 }
 readFile.close();
 //未找到,返回默认值及其长度
 return StrCopy(strDefault, pReturnedValue, size);
}
//************************************
// Method:    StrCopy
// FullName:  MyClass::StrCopy
// Access:    Private
// Returns:   int
// Parameter: QString source
// Parameter: char *dest
// Parameter: int size
//************************************
int MyClass::StrCopy(QString source, char *dest, int size)
{
 QByteArray temp = source.toAscii();
 //拷贝字符串;
 //size合适,返回不加'/0'的字符串长度
 if(source.length() <= size - 1)
 {
  strcpy(dest, temp.data());
  return source.length();
 }
 //拷贝字符串;
 //size过小,返回size-1
 else
 {
  strncpy(dest, temp.data(), size-1);
  dest[size - 1] = '/0';
  return size-1;
 }
}

原创粉丝点击