linux读取配置文件(C语言版)
一个通用的linux系统中C语言版读取配置文件的函数。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
|
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <errno.h>
#define KEYVALLEN 100
/* 删除左边的空格 */
char
* l_trim(
char
* szOutput,
const
char
*szInput)
{
assert
(szInput != NULL);
assert
(szOutput != NULL);
assert
(szOutput != szInput);
for
(NULL; *szInput !=
'\0'
&&
isspace
(*szInput); ++szInput){
;
}
return
strcpy
(szOutput, szInput);
}
/* 删除右边的空格 */
char
*r_trim(
char
*szOutput,
const
char
*szInput)
{
char
*p = NULL;
assert
(szInput != NULL);
assert
(szOutput != NULL);
assert
(szOutput != szInput);
strcpy
(szOutput, szInput);
for
(p = szOutput +
strlen
(szOutput) - 1; p >= szOutput &&
isspace
(*p); --p){
;
}
*(++p) =
'\0'
;
return
szOutput;
}
/* 删除两边的空格 */
char
* a_trim(
char
* szOutput,
const
char
* szInput)
{
char
*p = NULL;
assert
(szInput != NULL);
assert
(szOutput != NULL);
l_trim(szOutput, szInput);
for
(p = szOutput +
strlen
(szOutput) - 1;p >= szOutput &&
isspace
(*p); --p){
;
}
*(++p) =
'\0'
;
return
szOutput;
}
int
GetProfileString(
char
*profile,
char
*AppName,
char
*KeyName,
char
*KeyVal )
{
char
appname[32],keyname[32];
char
*buf,*c;
char
buf_i[KEYVALLEN], buf_o[KEYVALLEN];
FILE
*fp;
int
found=0;
/* 1 AppName 2 KeyName */
if
( (fp=
fopen
( profile,
"r"
))==NULL ){
printf
(
"openfile [%s] error [%s]\n"
,profile,
strerror
(
errno
) );
return
(-1);
}
fseek
( fp, 0, SEEK_SET );
memset
( appname, 0,
sizeof
(appname) );
sprintf
( appname,
"[%s]"
, AppName );
while
( !
feof
(fp) &&
fgets
( buf_i, KEYVALLEN, fp )!=NULL ){
l_trim(buf_o, buf_i);
if
(
strlen
(buf_o) <= 0 )
continue
;
buf = NULL;
buf = buf_o;
if
( found == 0 ){
if
( buf[0] !=
'['
) {
continue
;
}
else
if
(
strncmp
(buf,appname,
strlen
(appname))==0 ){
found = 1;
continue
;
}
}
else
if
( found == 1 ){
if
( buf[0] ==
'#'
){
continue
;
}
else
if
( buf[0] ==
'['
) {
break
;
}
else
{
if
( (c = (
char
*)
strchr
(buf,
'='
)) == NULL )
continue
;
memset
( keyname, 0,
sizeof
(keyname) );
sscanf
( buf,
"%[^=|^ |^\t]"
, keyname );
if
(
strcmp
(keyname, KeyName) == 0 ){
sscanf
( ++c,
"%[^\n]"
, KeyVal );
char
*KeyVal_o = (
char
*)
malloc
(
strlen
(KeyVal) + 1);
if
(KeyVal_o != NULL){
memset
(KeyVal_o, 0,
sizeof
(KeyVal_o));
a_trim(KeyVal_o, KeyVal);
if
(KeyVal_o &&
strlen
(KeyVal_o) > 0)
strcpy
(KeyVal, KeyVal_o);
free
(KeyVal_o);
KeyVal_o = NULL;
}
found = 2;
break
;
}
else
{
continue
;
}
}
}
}
fclose
( fp );
if
( found == 2 )
return
(0);
else
return
(-1);
}
void
main()
{
char
ip[16];
GetProfileString(
"./cls.conf"
,
"cls_server"
,
"ip"
, ip);
printf
(
"%s\n"
,ip);
}
|
配置文件例子如下:
1
2
3
|
[cls_server]
#配置文件等号左右可以有空格也可以没有
ip=192.16.31.2
|