zl程序教程

您现在的位置是:首页 >  后端

当前栏目

c++实现逐行读取配置文件写入内存的示例

C++内存配置文件 实现 示例 读取 写入 逐行
2023-06-13 09:15:26 时间

不解析配置内容,只读取文件内容,剪去注释和首尾空格后写入缓存:vector<string>中。供其他方法使用。
代码是在做一个MFC小工具时写的。

ReadProtocol.h

复制代码代码如下:

/**
*从文件中读取protocol的内容写入缓存
*供外部方法使用
*AlexLiu,2014
*/

#pragmaonce


#include<vector>
#include<map>
#include<list>
#include<string>

usingnamespacestd;


#define MAX_FILEPATH 512

#defineCOMMENT_FLG "#"
#defineSECTION_BEGIN_FLG "["
#defineSECTION_END_FLG  "]"

classReadProtocol{
public:
 ReadProtocol(char*FilePath);
 ~ReadProtocol();

 /**
 *返回值为errMsg的地址为了方便链式调用
 *缺省返回"成功"
 */
 char*GetErrInfo(char*errMsg,interrNo=0);
 /**
 *逐行读取文件内容写入m_StrVect
 *使用vector::push_back()写入
 *return0成功<0失败可根据返回值GetErrInfo
 */
 intReadIniFile();

 /**
 *获取根据目录获取一个
 *使用vector::push_back()写入
 *return0成功<0失败可根据返回值GetErrInfo
 */
 intGetOneSection(stringSection,list<string>&Protocol);

private:
 voidPushBackToVector(stringoneLine);

private:
 charm_IniFile[MAX_FILEPATH];
 stringm_ErrPos;

 map<string,unsignedint>m_SectionMap;
 vector<string>m_StrVect;
};

ReadProtocol.cpp

复制代码代码如下:

//

//#include"stdafx.h"
#include<fstream>

#include"ReadProtocol.h"

//去掉字符串首尾的空格
staticstringstrTrim(stringaStr)
{
   strings=aStr;
   unsignedintfirst,last;
   if(string::npos!=(first=s.find_first_not_of("")))
       s=s.substr(first,s.length()-first);
   if(string::npos!=(last=s.find_last_not_of("")))
       s=s.substr(0,last+1);
   returns;
}

///=====================================================================================

ReadProtocol::ReadProtocol(char*FilePath)
{
 intiLen=(strlen(FilePath)>MAX_FILEPATH)?MAX_FILEPATH:strlen(FilePath);
 memset(m_IniFile,0,MAX_FILEPATH);
 memcpy(m_IniFile,FilePath,iLen);
}

ReadProtocol::~ReadProtocol()
{
 m_SectionMap.clear();
 m_StrVect.clear();
}

intReadProtocol::GetOneSection(stringSection,list<string>&Protocol)
{
 unsignedintStart=0;
 //注意这里不能使用[]运算符
 map<string,unsignedint>::iteratoritr=m_SectionMap.find(Section);
 if(m_SectionMap.end()==itr)
 {
  m_ErrPos=Section;
  return-5;   //UnknownSection!!
 }
 else
 {
  Start=itr->second;
 }


 vector<string>::iteratorit=m_StrVect.begin()+Start+1;
 for(;it!=m_StrVect.end();++it)
 {
  unsignedintFirst,Last;
  First=it->find_first_of(SECTION_BEGIN_FLG);
  Last=it->find_last_of(SECTION_END_FLG);
  //stopwhenthenextSection
  if(string::npos!=First&&string::npos!=Last)
  {
   break;
  }

  Protocol.push_back(*it);
 }
 return(int)Protocol.size();
}

intReadProtocol::ReadIniFile()
{
 ifstreamfin(m_IniFile);
 if(!fin.is_open())
 {
  return-1; //can"topenfile
 }
 stringstrLine;
 unsignedintLast;

 while(std::getline(fin,strLine).good())
 {
  if(string::npos!=(Last=strLine.find_last_not_of("\r")))
  {
   //delete\r
   strLine=strLine.substr(0,Last+1);
  }
  PushBackToVector(strLine);
 }
 fin.close();

 if(m_StrVect.empty())
 {
  return-2; //getnotingfromfile
 }
 return0;
}

voidReadProtocol::PushBackToVector(stringoneLine)
{
 unsignedintuPos;
 //去掉行尾注释
 if(string::npos!=(uPos=oneLine.find_first_of(COMMENT_FLG)))
 {
  oneLine=oneLine.substr(0,uPos+1);
 }
 //去首尾空格
 oneLine=strTrim(oneLine);
 if(oneLine.empty()||oneLine.length()<2) return;

 //一行只能有一条记录
 unsignedintFirst,Last;
 First=oneLine.find_first_of(SECTION_BEGIN_FLG);
 Last=oneLine.find_last_of(SECTION_END_FLG);
 //isSection
 if(string::npos!=First&&string::npos!=Last)
 {
  m_SectionMap[oneLine.substr(First+1,Last-First-1)]=m_StrVect.size();
 }
 m_StrVect.push_back(oneLine);
}

char*ReadProtocol::GetErrInfo(char*errMsg,interrNo)
{
 stringerrInfo;
 switch(errNo)
 {
 case0:
  {
   errInfo="Success!";
   break;
  }
 case-1:
  {
   charPath[1024]={0};
   intpLength=1024;
   GetCurrentDirectory(pLength,Path);
   errInfo.append("Can"topenfile.Thefilenameis:==>\"");
   errInfo.append(m_IniFile);
   errInfo.append("\"\r\nMaybenosuchfileinPath:");
   errInfo.append(Path);
   break;
  }
 case-2:
  {
   errInfo="Getnotingfromfile:";
   errInfo.append(m_IniFile);
   break;
  }
 case-3:
  {
   errInfo="Analyzefilefailed.In==>";
   errInfo.append(m_ErrPos);
   break;
  }
 case-5:
  {
   errInfo="\r\nUnknownSection!!==>\"[";
   errInfo.append(m_ErrPos);
   errInfo.append("]\"\r\n请检查配置文件中是否有遗漏。");
   break;
  }
 default:
  {
   errInfo="请按照正确步骤使用";
  }
 }
 memcpy(errMsg,errInfo.c_str(),errInfo.length());
 returnerrMsg;
}