c++实现逐行读取配置文件写入内存的示例
不解析配置内容,只读取文件内容,剪去注释和首尾空格后写入缓存: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;
}
相关文章
- C++string类作为形参传值,实参与形参的变化
- turtle(海龟作图),C++版「建议收藏」
- C++运算符重载(四)之赋值运算符重载
- 链表的合并c++
- C++结构体和类的区别_c++有结构体吗
- 《安富莱嵌入式周报》第293期:SEGGER开源其C/C++库源码emRun,丰富EMC电磁兼容资,OTA开源组件,2022 Github全球报告,内存安全指南
- C/C++ 实现正向CMDShell
- C/C++ 内存读写Lib库简单封装
- C/C++ 内存遍历与KMP特征搜索
- C/C++ Qt 命令行版网络通信
- 软件开发入门教程网之C++ 信号处理
- 从C和C++内存管理来谈谈JVM的垃圾回收算法设计-上
- 从C和C++内存管理来谈谈JVM的垃圾回收算法设计-下
- 【C++修炼之路】19.AVL树
- 【C++】类和对象 (上篇)
- 【C++】动态内存管理
- 【C++】多态
- C/C++内存管理
- C++内存管理
- C++三大特性之封装详解编程语言
- C++ new和delete(C++动态分配和释放内存)
- C++ find(STL find)查找算法详解
- C++ string字符串修改和替换方法详解
- C++指针作为函数参数(详解版)
- C++ override和final关键字(详解版)
- 关于C++内存中字节对齐问题的详细介绍
- 浅析C/C++变量在内存中的分布
- C++中函数的用法小结
- c++判断是否为目录的示例分享
- C++实现的泛型List类分享
- VC++中内存对齐实例教程