当前位置:  编程技术>c/c++/嵌入式

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

    来源: 互联网  发布时间:2014-10-25

    本文导语:  不解析配置内容,只读取文件内容,剪去注释和首尾空格后写入缓存: vector 中。供其他方法使用。代码是在做一个MFC小工具时写的。 ReadProtocol.h 代码如下:/*** 从文件中 读取 protocol 的内容 写入缓存* 供外部方法使用* Alex Liu, 2014...

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

ReadProtocol.h

代码如下:

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

#pragma once


#include
#include
#include
#include

using namespace std;


#define MAX_FILEPATH 512

#define COMMENT_FLG '#'
#define SECTION_BEGIN_FLG '['
#define SECTION_END_FLG  ']'

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

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

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

private:
 void PushBackToVector(string oneLine);

private:
 char m_IniFile[MAX_FILEPATH];
 string m_ErrPos;

 map m_SectionMap;
 vector m_StrVect;
};

ReadProtocol.cpp

代码如下:

//

//#include "stdafx.h"
#include

#include "ReadProtocol.h"

//去掉字符串首尾的空格
static string strTrim(string aStr)
{
    string s = aStr;
    unsigned int first, 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);
    return s;
}

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

ReadProtocol::ReadProtocol(char* FilePath)
{
 int iLen = (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();
}

int ReadProtocol::GetOneSection(string Section, list &Protocol)
{
 unsigned int Start = 0;
 // 注意这里不能使用 [] 运算符
 map::iterator itr = m_SectionMap.find(Section);
 if (m_SectionMap.end() == itr)
 {
  m_ErrPos = Section;
  return -5;   // Unknown Section!!
 }
 else
 {
  Start = itr->second;
 }


 vector::iterator it = m_StrVect.begin() + Start + 1;
 for (; it!=m_StrVect.end(); ++it)
 {
  unsigned int First, Last;
  First = it->find_first_of ( SECTION_BEGIN_FLG );
  Last = it->find_last_of ( SECTION_END_FLG );
  // stop when the next Section
  if( string::npos != First && string::npos != Last)
  {
   break;
  }

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

int ReadProtocol::ReadIniFile()
{
 ifstream fin(m_IniFile);
 if (!fin.is_open())
 {
  return -1; //can'topen file
 }
 string strLine;
 unsigned int Last;

 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; //get noting from file
 }
 return 0;
}

void ReadProtocol::PushBackToVector(string oneLine)
{
 unsigned int uPos;
 //去掉行尾注释
 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;

 //一行只能有一条记录
 unsigned int First, Last;
 First = oneLine.find_first_of(SECTION_BEGIN_FLG);
 Last = oneLine.find_last_of(SECTION_END_FLG);
 // is Section
 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, int errNo)
{
 string errInfo;
 switch (errNo)
 {
 case 0:
  {
   errInfo = "Success!";
   break;
  }
 case -1:
  {
   char Path[1024] = {0};
   int pLength = 1024;
   GetCurrentDirectory(pLength, Path);
   errInfo.append("Can't open file. The file name is:==>"");
   errInfo.append( m_IniFile);
   errInfo.append(""rnMaybe no such file in Path:");
   errInfo.append(Path);
   break;
  }
 case -2:
  {
   errInfo = "Get noting from file: ";
   errInfo.append(m_IniFile);
   break;
  }
 case -3:
  {
   errInfo = "Analyze file failed. In ==> ";
   errInfo.append(m_ErrPos);
   break;
  }
 case -5:
  {
   errInfo = "rnUnknown Section!! ==> "[";
   errInfo.append(m_ErrPos);
   errInfo.append("]"rn请检查配置文件中是否有遗漏。");
   break;
  }
 default:
  {
   errInfo = "请按照正确步骤使用";
  }
 }
 memcpy(errMsg, errInfo.c_str(), errInfo.length());
 return errMsg;
}


    
 
 

您可能感兴趣的文章:

  • Base64编码原理详解及c++编码解码实现
  • 我实现了个J2EE技术的服务器,支持TCP、UDP和数据库,由于性能的原因,需要改为C或C++实现,我是C、C++新手,我该如何入手呢?看什么样的
  • c++实现MD5算法代码示例
  • java 与 C++ 实现后绑定的方法
  • c++通用模板类(template class)定义实现详细介绍
  • Qt实现的C++框架 qtioccontainer
  • 用C或C++实现主存的分配与回收
  • 在linux系统上,如何用C++实现获取和设置系统时间?
  • c语言实现MD5算法完整代码示例 iis7站长之家
  • C++标准库实现 libc++
  • C++的XMLRPC实现 XMLRPC++
  • Java/JavaScript API 的 C++ 实现 libj
  • c++ 连接两个字符串实现代码 实现类似strcat功能
  • c++在unix中如何实现CString的方法?或者说有没有替换CString的类?
  • 请问:java中如何实现C++中的sizeof()方法?
  • 用C或C++编程,模拟可变分区存储管理且首次适应的算法实现存储器的分配与回收
  • vim中如何实现c++代码编写的自动格式化和语法高亮的功能?
  • C++实现CreatThread函数主线程与工作线程交互的方法
  • 请教为什么在C++编译通过并实现的程序,在linux下就会出错
  • linux下c++怎样实现回调(CALLBACK)函数?
  • 在linux下如何用c++实现建立一个文件夹
  • 基于DIV+ul+li实现的表格(多示例)
  • python实现绘制树枝简单示例
  • c语言实现MD5算法完整代码示例
  • ThinkPHP实现事务回滚示例代码
  • 使用libpcap实现抓包程序的步骤及代码示例
  • 修改.htaccess实现301域名重定向示例分享
  • java Servlet实现Session创建存取以及url重写代码示例
  • php实现数组筛选奇数和偶数示例
  • 数据结构:图(有向图,无向图),在Python中的表示和实现代码示例
  • python实现倒计时的示例
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 如何在向xml文件写入节点时,能够实现分行显示,而不是都排在一行里,即如何实现换行?
  • 如何在写入文件时实现回车功能,即换行!多谢,一定给分。在线等待!
  • Android实现将已发送的短信写入短信数据库的方法
  • VC++实现CStdioFile写入及读取文件并自动换行的方法
  • C# 创建文本文件写入读取实现代码
  • c#实现把异常写入日志示例(异常日志)
  • fopen打开的文件,如何实现当文件达到一定大小后,重头进行覆盖写入
  • C#实现写入与读出文本文件的实例代码
  • 散分!!如何实现用Java将数据写入Excel表
  • php操作XML、读取数据和写入数据的实现代码
  • asp.net写入pdf文件的实现代码
  • 通过javascript实现DIV居中,兼容各浏览器版本
  • socket实现多文件并发传输,求助多线程实现问题?
  • Python GUI编程:tkinter实现一个窗口并居中代码
  • interface 到底有什么用???实现接口,怎么实现??
  • 通过javascript库JQuery实现页面跳转功能代码
  • 怎么用Jsp实现在页面实现树型结构?
  • sharepoint 2010 使用STSNavigate函数实现文件下载举例
  • windows 下的PortTunnel 在linux下怎么实现?或者相应的已经实现的软件?端口映射
  • php实现socket实现客户端和服务端数据通信源代码
  • 网站重定向用C语言实现iptables,ACL实现
  • flash AS3反射实现(describeType和getDefinitionByName)
  • 在linux下如何编程实现nslookup命令实现的IP地址和域名互相转换的功能?
  • boost unordered_map和std::list相结合的实现LRU算法
  • 求在freebsd+Squid下实现pc上网的透明代理的实现方法!给出具体配置方法的高分谢!
  • c#通过委托delegate与Dictionary实现action选择器代码举例
  • linux下如实现与window下的驱动器实现文件共享??
  • 使用java jdk中的LinkedHashMap实现简单的LRU算法
  • qt如何实现:操作键盘实现数据的滚动?
  • iphone cocos2d 精灵的动画效果(图片,纹理,帧)CCAnimation实现
  • 我想用APPLET实现读取客户端的图片文件,该如何实现?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3