/*
* 测试了很多次,之前的版本在出现读文件时,未找到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);
}