unx下多次读配置文件的C++类

/*

* 测试了很多次,之前的版本在出现读文件时,未找到value的情况下不能继续查找其他的value值。

  目前这个版本解决了这个问题,可以多次读配置文件。

  主要是在closeFile()这里。 在fp.good非真时,需要clear()清空流的内部状态。

*

*/

/*

  此部分转:

关闭流并不能改变流对象的内部状态。如果最后的读写操作失败了,对象的状态将保持为错误模式,直到执行 clear 操作重新恢复流的状态为止。调用 clear 后,就像重新创建了该对象一样。如果程序员需要重用文件流读写多个文件,必须在读另一个文件之前调用 clear 清除该流的状态。

*/

 

#include<iostream>
#include<fstream>
using namespace std;


class readCfg
{
private:
 ifstream fp;
 char _filename[128];
 void reReadCfg();
 void closeFile();
 
public:
 readCfg(char* filename);
 void readValue(char* session,char* key);
 ~readCfg();
};

readCfg::readCfg(char* filename)
{
 memset(_filename,0,sizeof(_filename));
 strcpy(_filename,filename);
 //cout << "_filename = " << _filename <<endl;
 //fp.open(filename,ios::in);
}

readCfg::~readCfg()
{
 closeFile();
}

void readCfg::reReadCfg()
{
 //cout << "_filename = " << _filename <<endl;
 closeFile();
 
 fp.open(_filename,ios::in);
 if(!fp.good())
 {
  cout << "open file not good." << endl;
 }
 
}

void readCfg::closeFile()
{
 if(fp != NULL)
 {
  fp.close();
 }
 if(!fp.good())
 {
  fp.clear();
 }
}

void readCfg::readValue(char* session,char* key)
{
 reReadCfg();
 
 if(fp != NULL)
 {
  char line[128];
  memset(line,0,sizeof(line));
  bool sessionFlag = false;
  bool valueFlag = false;
  char * pkey = NULL;
  while(!fp.eof())
  {
   fp >> line;
   if(line[0] == '#')
    continue;
   if(line[0] != '[' && !sessionFlag)
    continue;
   else if(line[0] == '[' && !sessionFlag)
   {
    char tmp[128];
    memset(tmp,0,sizeof(tmp));
    sprintf(tmp,"[%s]",session);
    if(strcmp(tmp,line) == 0)
     sessionFlag = true;
    else
     continue;
   }else if(sessionFlag)
   {
    char tmp[128];
    memset(tmp,0,sizeof(tmp));
    sprintf(tmp,"%s=",key);
    pkey = strstr(line,tmp);
    
    if(pkey!=NULL)
    {
     cout << "value=" << pkey+strlen(key)+1 << endl;
     valueFlag = true;
     break;
    }
    if(line[0] == '[')
    {
     break;
    }
   }
  }
  
  if(!valueFlag)
  {
   //fp.seekg(ios::beg);
   cout << "not found this value." << endl;
  }
 }else
 {
  //fp.seekg(ios::beg);
  cout << "open file error." << endl;
 }
 
 closeFile();
 
}


int main()
{
 readCfg fin("test.ini");
 fin.readValue("cca","name");
 fin.readValue("cca","age");
 fin.readValue("pro","age");
 fin.readValue("123","age");
 fin.readValue("123","age");
 fin.readValue("cca","age");
 fin.readValue("pro","age");
 exit(0);
}

 

 

版本2 c++ 版本

readCfg.cpp

#include<iostream>
#include<fstream>
#include<string>
using namespace std;
#include "readCfg.h"

readCfg::readCfg(string filename)
{
 Ffilename = filename;
 cout<< "Filename is:" << Ffilename << endl;
}

readCfg::~readCfg()
{
 closeFile();
}

void readCfg::reReadCfg()
{
 closeFile();
 try
 {
  Ffp.open(Ffilename.c_str(),ios::in);
 }catch(exception& ex)
 {
  cout << "Open File error!" << endl;
  cout << "Exception caught is :" << ex.what() << endl ;
 }
}

void readCfg::closeFile()
{
 try
 {
  Ffp.close();
  if(!Ffp.good())
  {
   Ffp.clear();
  }
  
 }catch(exception& ex)
 {
  cout << "Close File error!" << endl;
  cout << "Exception caught is: " << ex.what() << endl;
 }
}


void readCfg::readValue(string session,string key)
{
 reReadCfg();
 
 string line;
 bool sessionFlag = false;
 bool valueFlag = false;
 
 while(!Ffp.eof())
 {
  Ffp >> line;
  if(line[0] == '#')
   continue;
  if(line[0] != '[' && !sessionFlag)
   continue;
  else if(line[0] == '[' && !sessionFlag)
  {
   string tmp("["+session+"]");
   if(line.compare(tmp)==0)
   {
    sessionFlag = true;
   }else
   {
    continue;
   }
   
  }else if(sessionFlag)
  {
   string tmpkey(key+"=");
   if(line.compare(0,tmpkey.size(),tmpkey)==0)
   {
    valueFlag = true;
    cout << "value=" << line.substr(tmpkey.size()) << endl;
   }
   if(line[0] == '[')
   {
    break;
   }
  }
 }
 
 if(!valueFlag)
 {
  cout << "Not found this value." << endl;
 }
 
}

string readCfg::getFilename()
{
 return Ffilename;
}

 

readCfg.h

#include<iostream>
#include<fstream>
#include<string>
using namespace std;

class readCfg
{
private:
 ifstream Ffp;
 string Ffilename;
 void reReadCfg();
 void closeFile();
 
public:
 readCfg(string filename);
 void readValue(string session,string key);
 ~readCfg();
 string getFilename();
};

testCfg.cpp

#include<iostream>
#include<fstream>
#include<string>
using namespace std;
#include "readCfg.h"


int main()
{
 readCfg fin("test.ini");
 cout << fin.getFilename() << endl;
 fin.readValue("cca","name");
 fin.readValue("cca","age");
 fin.readValue("pro","age");
 fin.readValue("123","age");
 fin.readValue("123","age");
 fin.readValue("pro","name");
 fin.readValue("pro","age");
 
 exit(0);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值