`
xpp02
  • 浏览: 1049249 次
社区版块
存档分类
最新评论

C读写ini文件

 
阅读更多
/*
read/write ini file with c function
@file testini.c
chinayaosir
blog: http://blog.csdn.net/chinayaosir
connect.ini
[database]
此程序有些BUG
当ini文件不存在时,第一次建立connect.ini文件时,
在[database]前面会多一个空格.
*/
#include "stdio.h"
#include "inifile.h"
#define BUF_SIZE 256


int main()
{
const char * file = "connect.ini";
char severname[BUF_SIZE] = {0};
int port=0;

printf( "1. write/read ini file testting .../n" );

printf( "2. write data into ini file.../n" );

if (! write_profile_string("database", "sever" , "192.168.1.2",file))

{ printf( "2.1 server write %s file fail/n",file ); }
else
{
printf( "2.1 server write %s file ok/n",file );
}
if (! write_profile_string("database", "port" , "5000",file))
{ printf( "2.2 port write %s file fail/n",file ); }
else
{
printf( "2.2 port write %s file ok/n",file );
}

printf( "3. read data from ini file.../n" );

if ( ! read_profile_string("database", "sever", severname,BUF_SIZE,file))
{ printf( "3.1 sever read %s file fail/n",file ); }
else
{ printf( "3.1 sever = %s/n" ,severname);}

if ( ! read_profile_int("database", "port", port,file))
{ printf( "3.2 port read %s file fail/n",file ); }
else
{ port=read_profile_int("database", "port", port,file);
printf( "3.2 port = %d/n" ,port);
}

return 0 ;

}

/*
run value:
1. write/read ini file testting ...
2. write data into ini file...
2.1 server write connect.ini file ok
2.2 port write connect.ini file ok
3. read data from ini file...
3.1 sever = 192.168.1.2
3.2 port = 5000
*/

/////////////////////////////////////////////////////////////////////////
/* *
*@file inifile.h
*@cpright (C)2007 GEC
*@auther dengyangjun
*@email dyj057@gmail.com
*@version 0.1
*@create 2007-1-14
*@modify 2007-1-14
*@brief declare ini file operation
*@note
*@history
*/

#ifndef INI_FILE_H_
#define INI_FILE_H_

#ifdef __cplusplus
extern " C "
{
#endif

int read_profile_string(const char * section,const char * key,char * value,int size,const char * file);
int read_profile_int( const char * section,const char * key, int default_value,const char * file);
int write_profile_string(const char * section,const char * key,const char * value, const char * file);

#ifdef __cplusplus
}; // end of extern "C" {
#endif

#endif // end of INI_FILE_H_

//////////////////////////////////////////////////////////////////////////////
/* *
*@file inifile.c
*@cpright (C)2007 GEC
*@auther dengyangjun
*@email dyj057@gmail.com
*@version 0.1
*@create 2007-1-14
*@modify 2007-1-14
*@brief implement ini file operation
*@note
*@history
*/
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>
#include <ctype.h>

#include "inifile.h"

#ifdef __cplusplus
extern " C "
{
#endif

#define MAX_FILE_SIZE 8096

#define LEFT_BRACE '['
#define RIGHT_BRACE ']'

static int load_ini_file(const char * file, char * buf, int * file_size)
{
int i = 0 ;
FILE * in = NULL;
*file_size = 0 ;
assert(file != NULL);
assert(buf != NULL);

in = fopen(file, "r" );
if ( NULL == in ) {
return 0 ;
}

// load initialization file
while ((buf[i] = fgetc(in)) != EOF) {
i ++ ;
assert( i < MAX_FILE_SIZE); // file too big
}

buf[i] = '/0' ;
*file_size = i;

fclose(in);
return 1 ;
}

/*
*<summary></summary>
* <returns>Result of the addtion(int)</returns>
* <param name="x"></param>
* <param name="y"></param>
*/

static int isnewline( char c)
{
return ( '/n' == c || '/r' == c ) ? 1 : 0 ;
}
static int isend( char c)
{
return '/0' == c ? 1 : 0 ;
}
static int isleftbarce( char c)
{
return LEFT_BRACE == c ? 1 : 0 ;
}
static int isrightbrace( char c )
{
return RIGHT_BRACE == c ? 1 : 0 ;
}

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)
{
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 ( ! isend(p[i]) )
{
// find the section
if ( ( 0 == i || isnewline(p[i - 1 ]) ) && isleftbarce(p[i]) )
{
int section_start = i + 1 ;

// find the ']'
do
{
i ++ ;
} while ( ! isrightbrace(p[i]) && ! isend(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 ( ! (isnewline(p[i - 1 ]) && isleftbarce(p[i])) && ! isend(p[i]) )
{
int j = 0 ;
// get a new line
newline_start = i;

while ( ! isnewline(p[i]) && ! isend(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_profile_string <d>retrieves a string from the specified section in an initialization file.
* @param section <t>const char * <in> <d>name of the section containing the key name.
* @param key <t>const char * <in><d>the name of the key whose associated string is to be retrieved.
* @param value <t>char * <out><d>pointer to the buffer that receives the retrieved string.
* @return <t>int <n>1 : read success; 0 : read fail.
*/
int read_profile_string(
const char * section,
const char * key,
char * value,
int size,
const char * file)
{
char buf[MAX_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))
return 0 ;

if ( ! parse_file(section,key,buf, & sec_s, & sec_e, & key_s, & key_e, & value_s, & value_e))
{
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 ;
}
}


int 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),file))
{
return default_value;
}
else
{
return atoi(value);
}
}

int write_profile_string(const char * section,
const char * key,
const char * value,
const char * file)
{
char buf[MAX_FILE_SIZE] = { 0 };
char w_buf[MAX_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 ;
}


#ifdef __cplusplus
}; // end of extern "C" {
#endif
分享到:
评论

相关推荐

    纯C语言读写ini配置文件

    标题 "纯C语言读写ini配置文件" 描述的是一个使用C语言编写的程序,能够处理常见的ini配置文件。ini文件是一种简单的文本格式,通常用于存储应用程序的设置和配置信息。这种格式易于阅读和编辑,适合小型应用或系统...

    c语言读写ini文件

    在C语言中,读写INI文件是一个常见的任务,特别是在配置文件处理方面。INI文件是一种简单的文本格式,用于存储用户配置信息或程序设置。由于题目提到不使用Win32系统的DLL,我们将探讨如何纯C语言实现读写INI文件的...

    Linux Windows C++读写ini文件

    使用libconfig可以简化读写ini文件的过程: ```cpp #include #include void readConfig(const char* filePath, libconfig::Config& config) { config.readFile(filePath); // 从config对象中获取数据... } ...

    c语言读写ini文件的程序代码,跨平台支持

    提供的`iniread`文件可能是实现ini文件读写的C语言源代码,包含了一个或者多个函数,如`readIniFile()`和`writeIniFile()`,用于实现上述功能。你可以查看这个源代码,理解其工作原理,并根据项目需求进行修改和优化...

    C语言读写ini文件,用法类似面向对象。.zip

    在这个案例中,“C语言读写ini文件,用法类似面向对象”的主题意味着我们将探讨如何使用C语言来操作INI配置文件,同时保持代码的模块化和易于使用。 INI文件是一种简单的文本格式,常用于存储程序的配置信息,由节...

    VisualC 实效编程 76 读写INI文件

    VisualC 实效编程 76 读写INI文件VisualC 实效编程 76 读写INI文件VisualC 实效编程 76 读写INI文件VisualC 实效编程 76 读写INI文件VisualC 实效编程 76 读写INI文件VisualC 实效编程 76 读写INI文件VisualC 实效...

    标准C/C++读写配置文件类,读写ini文件,加入工程就可以用

    标题提到的“标准C/C++读写配置文件类”是指一个专门用于处理INI文件的C++类,它使得开发者能够方便地读取和写入配置文件。这类库通常会封装文件操作的复杂性,提供简洁的API供程序员调用。描述中提到的“非常完美的...

    纯c读写ini配置文件

    纯c读写ini配置文件 用c/c++读写ini配置文件有不少第三方的开源库,如iniparser、libini、rwini、UltraLightINIParser等,但都不理想,往往代码较大、功能较弱、 接口使用不方便。尤其在大小写处理、前后空格、各种...

    QT中读写ini文件 - 高恩阳的博客 - CSDN博客1

    这篇博客文章主要介绍了如何使用QT库中的QSettings类来处理.INI文件的读写操作。 首先,我们需要理解.INI文件的结构。它是初始化文件的简称,最初在Windows系统中广泛使用,但现在也被其他操作系统采用。这种文件由...

    VB6.0读写INI文件

    VB6.0(Visual Basic 6.0)是微软推出的一种可视化编程环境,它提供了丰富的功能来处理各种任务,包括读写INI文件。下面将详细阐述如何在VB6.0中进行INI文件的操作。 首先,理解INI文件结构。INI文件由多个节...

    c++ Linux下读写ini文件

    总的来说,`Ini.cpp`和`Ini.h`的组合为在Linux下使用C++读写INI文件提供了便利的抽象层。通过这个类,开发者可以避免直接与文件流交互的复杂性,更专注于业务逻辑。这种设计模式在C++编程中很常见,特别是在处理特定...

    MFC INI文件读写

    ### MFC INI 文件读写详解 #### 一、概述 在 Windows 操作系统中,INI 文件是一种重要的配置文件格式,通常用于存储程序的配置信息。对于开发人员来说,掌握如何使用 MFC(Microsoft Foundation Classes)框架进行...

    Linux 下读写 INI 的程序 (纯C语言)

    本项目提供了在Linux下用纯C语言读写INI文件的实现方法。 首先,理解INI文件的基本结构至关重要。INI文件由多个节(Section)组成,每个节有一个名称,放在方括号`[]`内。节内包含若干键值对,键和值之间用等号`=`...

    linux下读写ini文件

    c++写的在linux下读写ini文件。 读 ini.openfile(path, "r"); ini.getstr(...); ini.closefile(); 写 ini.openfile(path, "w"); ini.setstr(...); ini.closefile();

    ASP读写INI文件

    首先,`RWIniFile.inc` 文件很可能是包含一个或多个ASP函数的库,这些函数用于读取和写入.INI文件。通常,这样的函数会包括`ReadIni` 和 `WriteIni`,分别用于从.INI文件中获取值和向.INI文件中写入值。例如: ```...

    C++读写ini配置文件

    本文将深入探讨如何使用C++来读写ini配置文件,主要参考提供的"rwconfig.cpp"和"rwconfig.h"源代码。 首先,我们需要了解ini文件的基本结构。它由一系列节(Section)组成,每个节内包含若干键值对(Key-Value ...

    linux 下实现对ini文件的读取和写入

    例如,libconfig提供了一套API,可以方便地读写ini文件,如`config_setting_lookup()`, `config_setting_get_string()`等。 6. **Python实现** Python的`configparser`模块是处理ini文件的标准库,提供了`...

    如何读写INI文件(Visual studio VB源代码编写)

    本篇文章将深入探讨如何在Visual Studio的VB环境中读写INI文件,通过源代码的方式进行实战演示。 首先,理解INI文件的基本结构至关重要。INI文件通常包含多个节(Section),每个节下面又包含多个键值对(Key-Value...

    C语言版本读写ini文件接口_ini.zip

    C语言版本读写ini文件接口_ini

    wince读写ini文件

    在这个例子中,我们首先定义了读写INI文件的两个函数,然后在主函数中调用这些函数来写入一个键值对并读取它。 四、注意事项 1. 为了确保数据安全,写入INI文件前应检查文件是否存在,并且拥有正确的权限。 2. ...

Global site tag (gtag.js) - Google Analytics