=====文件名:IniFile.h=====
/**
* @file
* @brief initialization file read and write API
* @author Deng Yangjun
* @date 2007-12-9
* @version 0.2
* (C)2007 Midapex
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU Library General Public License as published
* by the Free Software Foundation; either version 2 of the License,
* or (at your option) any later version.
*/
#ifndef INI_FILE_CPP_H_
#define INI_FILE_CPP_H_
#include <string>
using namespace std;
class IniFile
{
public:
IniFile(const string & fileName);
public:
virtual ~IniFile(void);
const string & getFileName() const;
const string &getSection() const;
void setSection(const string §ion);
bool write(const string &key, const string & value) const ;
bool write(const string &key, int value) const ;
string readStr(const string &key,const string &default_value) const;
int readInt(const string &key, int default_value) const;
public:
static int read_profile_string( const char *section, const char *key,char *value,
int size, const char *default_value, const char *file);
static int read_profile_int( const char *section, const char *key,int default_value,
const char *file);
static int write_profile_string(const char *section, const char *key,
const char *value, const char *file);
private:
static int load_ini_file(const char *file, char *buf,int *file_size);
static int newline(char c);
static int end_of_string(char c);
static int left_barce(char c);
static int right_brace(char c );
static int parse_file(const char *section, const char *key, const char *buf,int *sec_s,int *sec_e,
int *key_s,int *key_e, int *value_s, int *value_e);
private:
string m_fileName;
string m_section;
};
#endif
=====文件名:IniFile.cpp=====
/*
* @file
* @brief initialization file read and write API implementation
* @author Deng Yangjun
* @date 2007-12-9
* @version 0.2
* (C)2007 Midapex
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU Library General Public License as published
* by the Free Software Foundation; either version 2 of the License,
* or (at your option) any later version.
*/
#include "IniFile.h"
#include <fstream>
#include <cassert>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#define MAX_INI_FILE_SIZE 1024*16
IniFile::IniFile(const string & fileName)
{
m_fileName = fileName;
}
IniFile::~IniFile(void)
{
}
const string & IniFile::getFileName() const
{
return m_fileName;
}
void IniFile::setSection(const string §ion)
{
m_section = section;
}
bool IniFile::write(const string &key, const string & value) const
{
return write_profile_string(m_section.c_str(),key.c_str(),value.c_str(),m_fileName.c_str())==1? true:false;
}
bool IniFile::write(const string &key, int value) const
{
char tmp[64];
sprintf(tmp,"%d",value);
return write(key,tmp);
}
string IniFile::readStr(const string &key,const string &default_value) const
{
char buf[4096];
read_profile_string(m_section.c_str(),key.c_str(),buf,sizeof(buf),default_value.c_str(),m_fileName.c_str());
return buf;
}
int IniFile::readInt(const string &key, int default_value) const
{
return read_profile_int(m_section.c_str(),key.c_str(),default_value,m_fileName.c_str());
}
const string &IniFile::getSection() const
{
return m_section;
}
int IniFile::load_ini_file(const char *file, char *buf,int *file_size)
{
FILE *in = NULL;
int i=0;
*file_size =0;
assert(file !=NULL);
assert(buf !=NULL);
in = fopen(file,"r");
if( NULL == in) {
return 0;
}
buf[i]=fgetc(in);
//load initialization file
while( buf[i]!= (char)EOF) {
i++;
assert( i < MAX_INI_FILE_SIZE ); //file too big, you can redefine MAX_INI_FILE_SIZE to fit the big file
buf[i]=fgetc(in);
}
buf[i]='\0';
*file_size = i;
fclose(in);
return 1;
}
int IniFile::newline(char c)
{
return ('\n' == c || '\r' == c )? 1 : 0;
}
int IniFile::end_of_string(char c)
{
return '\0'==c? 1 : 0;
}
int IniFile::left_barce(char c)
{
return '[' == c? 1 : 0;
}
int IniFile::right_brace(char c )
{
return ']' == c? 1 : 0;
}
int IniFile::parse_file(const char *section, const char *key, const char *buf,int *sec_s,int *sec_e,
int *key_s,int *key_e, int *value_s, int *value_e)
{
const char *p = buf;
int i=0;
assert(buf!=NULL);
assert(section != NULL && strlen(section));
assert(key != NULL && strlen(key));
*sec_e = *sec_s = *key_e = *key_s = *value_s = *value_e = -1;
while( !end_of_string(p[i]) ) {
//find the section
if( ( 0==i || newline(p[i-1]) ) && left_barce(p[i]) )
{
int section_start=i+1;
//find the ']'
do {
i++;
} while( !right_brace(p[i]) && !end_of_string(p[i]));
if( 0 == strncmp(p+section_start,section, i-section_start)) {
int newline_start=0;
i++;
//Skip over space char after ']'
while(isspace(p[i])) {
i++;
}
//find the section
*sec_s = section_start;
*sec_e = i;
while( ! (newline(p[i-1]) && left_barce(p[i]))
&& !end_of_string(p[i]) ) {
int j=0;
//get a new line
newline_start = i;
while( !newline(p[i]) && !end_of_string(p[i]) ) {
i++;
}
//now i is equal to end of the line
j = newline_start;
if(';' != p[j]) //skip over comment
{
while(j < i && p[j]!='=') {
j++;
if('=' == p[j]) {
if(strncmp(key,p+newline_start,j-newline_start)==0)
{
//find the key ok
*key_s = newline_start;
*key_e = j-1;
*value_s = j+1;
*value_e = i;
return 1;
}
}
}
}
i++;
}
}
}
else
{
i++;
}
}
return 0;
}
/*
*@brief read string in initialization file\n
* retrieves a string from the specified section in an initialization file
*@param section [in] name of the section containing the key name
*@param key [in] name of the key pairs to value
*@param value [in] pointer to the buffer that receives the retrieved string
*@param size [in] size of result's buffer
*@param default_value [in] default value of result
*@param file [in] path of the initialization file
*@return 1 : read success; \n 0 : read fail
*/
int IniFile::read_profile_string( const char *section, const char *key,char *value,
int size, const char *default_value, const char *file)
{
char buf[MAX_INI_FILE_SIZE]={0};
int file_size;
int sec_s,sec_e,key_s,key_e, value_s, value_e;
//check parameters
assert(section != NULL && strlen(section));
assert(key != NULL && strlen(key));
assert(value != NULL);
assert(size > 0);
assert(file !=NULL &&strlen(key));
if(!load_ini_file(file,buf,&file_size))
{
if(default_value!=NULL)
{
strncpy(value,default_value, size);
}
return 0;
}
if(!parse_file(section,key,buf,&sec_s,&sec_e,&key_s,&key_e,&value_s,&value_e))
{
if(default_value!=NULL)
{
strncpy(value,default_value, size);
}
return 0; //not find the key
}
else
{
int cpcount = value_e -value_s;
if( size-1 < cpcount)
{
cpcount = size-1;
}
memset(value, 0, size);
memcpy(value,buf+value_s, cpcount );
value[cpcount] = '\0';
return 1;
}
}
/*
*@brief read int value in initialization file\n
* retrieves int value from the specified section in an initialization file
*@param section [in] name of the section containing the key name
*@param key [in] name of the key pairs to value
*@param default_value [in] default value of result
*@param file [in] path of the initialization file
*@return profile int value,if read fail, return default value
*/
int IniFile::read_profile_int( const char *section, const char *key,int default_value,
const char *file)
{
char value[32] = {0};
if(!read_profile_string(section,key,value, sizeof(value),NULL,file))
{
return default_value;
}
else
{
return atoi(value);
}
}
/*
* @brief write a profile string to a ini file
* @param section [in] name of the section,can't be NULL and empty string
* @param key [in] name of the key pairs to value, can't be NULL and empty string
* @param value [in] profile string value
* @param file [in] path of ini file
* @return 1 : success\n 0 : failure
*/
int IniFile::write_profile_string(const char *section, const char *key,
const char *value, const char *file)
{
char buf[MAX_INI_FILE_SIZE]={0};
char w_buf[MAX_INI_FILE_SIZE]={0};
int sec_s,sec_e,key_s,key_e, value_s, value_e;
int value_len = (int)strlen(value);
int file_size;
FILE *out;
//check parameters
assert(section != NULL && strlen(section));
assert(key != NULL && strlen(key));
assert(value != NULL);
assert(file !=NULL &&strlen(key));
if(!load_ini_file(file,buf,&file_size))
{
sec_s = -1;
}
else
{
parse_file(section,key,buf,&sec_s,&sec_e,&key_s,&key_e,&value_s,&value_e);
}
if( -1 == sec_s)
{
if(0==file_size)
{
sprintf(w_buf+file_size,"[%s]\n%s=%s\n",section,key,value);
}
else
{
//not find the section, then add the new section at end of the file
memcpy(w_buf,buf,file_size);
sprintf(w_buf+file_size,"\n[%s]\n%s=%s\n",section,key,value);
}
}
else if(-1 == key_s)
{
//not find the key, then add the new key=value at end of the section
memcpy(w_buf,buf,sec_e);
sprintf(w_buf+sec_e,"%s=%s\n",key,value);
sprintf(w_buf+sec_e+strlen(key)+strlen(value)+2,buf+sec_e, file_size - sec_e);
}
else
{
//update value with new value
memcpy(w_buf,buf,value_s);
memcpy(w_buf+value_s,value, value_len);
memcpy(w_buf+value_s+value_len, buf+value_e, file_size - value_e);
}
out = fopen(file,"w");
if(NULL == out)
{
return 0;
}
if(-1 == fputs(w_buf,out) )
{
fclose(out);
return 0;
}
fclose(out);
return 1;
}
=====文件名:IniFileCpp.cpp=====
#include "IniFile.h"
#include <iostream>
using namespace std;
int main()
{
cout << "Midapex IniFile API 0.2.0" << endl;
string name_key = "name";
string age_key = "age";
IniFile ini("myconfig.ini");
ini.setSection("student");
// if(!ini.write(name_key,"Tony"))
// {
// cout << "write name to ini file fail"<<endl;
// return -1;
// }
if(!ini.write(age_key,20))
{
cout << "write age to ini file fail"<<endl;
return -1;
}
cout << "[" << ini.getSection()<< "]" <<endl;
cout << name_key << "=" << ini.readStr(name_key,"") << endl;
cout << age_key << "=" << ini.readInt(age_key,-1) << endl;
ini.setSection("teacher");
if(!ini.write(name_key,"Tom"))
{
cout << "write name to ini file fail"<<endl;
return -1;
}
if(!ini.write(age_key,50))
{
cout << "write age to ini file fail"<<endl;
return -1;
}
cout << "[" << ini.getSection()<< "]" <<endl;
cout << name_key << "=" << ini.readStr(name_key,"") << endl;
cout << age_key << "=" << ini.readInt(age_key,-1) << endl;
return 0;
}
分享到:
相关推荐
这个【标题】"C++读写INI类"所描述的,就是使用C++封装的类,它简化了对INI文件的操作。 在【描述】中提到,这个类是基于Windows API函数封装的,意味着它利用了如`GetPrivateProfileString`、`...
本文将深入探讨如何使用C++来读写INI文件,以及一个封装好的类`CParseIniFile`的实现。 INI文件通常包含键值对,组织在不同的节(section)中。每节以方括号`[]`括起,键值对则由等号`=`分隔。例如: ``` [Section...
C++读写ini文件的基本步骤** - **读取ini文件**:首先需要打开文件,然后逐行读取,解析出节和键值对。 - **写入ini文件**:创建或打开文件后,根据需要写入新的节或键值对,或者修改已有的键值。 **3. 在Windows...
本文将深入探讨如何使用C++来读写ini配置文件,主要参考提供的"rwconfig.cpp"和"rwconfig.h"源代码。 首先,我们需要了解ini文件的基本结构。它由一系列节(Section)组成,每个节内包含若干键值对(Key-Value ...
总的来说,`Ini.cpp`和`Ini.h`的组合为在Linux下使用C++读写INI文件提供了便利的抽象层。通过这个类,开发者可以避免直接与文件流交互的复杂性,更专注于业务逻辑。这种设计模式在C++编程中很常见,特别是在处理特定...
一般应用程序都会写配置文件(设置启动的一些参数)...在此提供纯c++下ini类的读写操作类,当然参数转换之后也可以应用到MFC框架之下!对于需要读写ini文件,而又不想花时间去写的话,还不错哦!程序中有用法示例...~~
在这个"**c++读写ini文件demo集成**"中,我们有两个示例程序,将展示如何在C++中实现读取和写入INI文件的功能。 首先,我们需要理解INI文件的基本结构。INI文件由多个节(Section)组成,每个节内包含若干键(Key)...
标题提到的"C/C++ 读写INI配置文件源代码"就是一个实现这一功能的源码库,它允许开发者在C或C++项目中轻松地读取和写入INI文件。 INI文件的结构通常由节(Section)、键(Key)和值(Value)组成,如: ```ini ...
2. 支持无SECTION的 Key-value 读写. 3. 跨平台. 4. 可配置 "=" 两边需不需要空格等. 详情用法请见Test内容。 eg: CSimpleIniA ini; ini.SetUnicode(); SI_Error rc = ini.LoadFile("example.ini"); if (rc )...
标题提到的“标准C/C++读写配置文件类”是指一个专门用于处理INI文件的C++类,它使得开发者能够方便地读取和写入配置文件。这类库通常会封装文件操作的复杂性,提供简洁的API供程序员调用。描述中提到的“非常完美的...
### C++读写INI文件详解 #### 一、概述 在软件开发过程中,经常会遇到需要存储配置信息的需求。为了方便管理这些配置数据,通常会采用INI文件格式来存储。INI文件是一种简单的文本文件,用于存储应用程序配置信息...
C++虽然没有内置的ini文件处理库,但可以通过标准库和自定义逻辑来实现ini文件的读写功能。下面我们将详细探讨如何在Linux和Windows平台上使用C++实现ini文件的读写。 1. **文件操作基础** 在C++中,文件操作主要...
**Linux/Win32下读写ini文件的C++类** 在编程中,ini文件是一种常见的配置文件格式,用于存储程序的设置和参数。它的结构简单,易于理解和处理。本篇将详细介绍如何在Linux和Windows环境下,使用C++编写一个类来...
c++写的在linux下读写ini文件。 读 ini.openfile(path, "r"); ini.getstr(...); ini.closefile(); 写 ini.openfile(path, "w"); ini.setstr(...); ini.closefile();
【标题】"一个基于STL读写ini的C++类:Base_Ini" 【描述】在C++编程中,管理配置文件通常是项目中必不可少的一部分。INI文件是一种常见的配置文件格式,用于存储应用的设置和参数。这个“Base_Ini”类库就是专为在...
总之,这个压缩包中的`IniFile`类提供了一种在C++中方便地读写INI文件的方式,通过封装文件操作和解析逻辑,使得代码更加简洁且易于复用。对于C++开发者来说,理解并能熟练使用这样的类,有助于提高开发效率,特别是...
用c/c++读写ini配置文件有不少第三方的开源库,如iniparser、libini、rwini、UltraLightINIParser等,但都不理想,往往代码较大、功能较弱、 接口使用不方便。尤其在大小写处理、前后空格、各种注释、跨平台换行符...
1.linux下INI配置文件读写操作库 ======================================================================== if(false) SET(CMAKE_SYSTEM_NAME Linux) set(CMAKE_C_COMPILER "/home/swapp/arm/5.4.0/bin/arm-...
标题中的“INI文件读写类”指的是在编程中用于处理INI配置文件的特定代码模块,这类模块通常包含一组函数或类,使得程序能够方便地读取、修改和保存INI文件中的数据。INI文件是一种简单的文本格式,常用于存储应用...
10.如何读写INI文件?(Visual C++编程 源代码)10.如何读写INI文件?(Visual C++编程 源代码)10.如何读写INI文件?(Visual C++编程 源代码)10.如何读写INI文件?(Visual C++编程 源代码)10.如何读写INI文件?...