C 读取ini文件的实例详解

2025-05-27 0 24

C 读取ini文件

前言:

在Windows下可以用GetPrivateProfileString或GetPrivateProfileInt方便读取.ini配置文件内容,但是在Linux平台上就一筹莫展了。为了解决该问题,打算用C来读取.ini,即可不受平台的限制了。

?

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

124

125

126

127

128

129

130

131
#define CONF_FILE_PATH "Config.ini"

#include <string.h>

#ifdef WIN32

#include <Windows.h>

#include <stdio.h>

#else

#define MAX_PATH 260

#include <unistd.h>

#include <fcntl.h>

#include <stdio.h>

#include <stdlib.h>

#include <stdarg.h>

#endif

char g_szConfigPath[MAX_PATH];

//获取当前程序目录

int GetCurrentPath(char buf[],char *pFileName)

{

#ifdef WIN32

GetModuleFileName(NULL,buf,MAX_PATH);

#else

char pidfile[64];

int bytes;

int fd;

sprintf(pidfile, "/proc/%d/cmdline", getpid());

fd = open(pidfile, O_RDONLY, 0);

bytes = read(fd, buf, 256);

close(fd);

buf[MAX_PATH] = '\\0';

#endif

char * p = &buf[strlen(buf)];

do

{

*p = '\\0';

p--;

#ifdef WIN32

} while('\\\\' != *p );

#else

} while('/' != *p );

#endif

p++;

//配置文件目录

memcpy(p,pFileName,strlen(pFileName));

return 0;

}

//从INI文件读取字符串类型数据

char *GetIniKeyString(char *title,char *key,char *filename)

{

FILE *fp;

char szLine[1024];

static char tmpstr[1024];

int rtnval;

int i = 0;

int flag = 0;

char *tmp;

if((fp = fopen(filename,"r")) == NULL)

{

printf("have no such file \\n");

return "";

}

while(!feof(fp))

{

rtnval = fgetc(fp);

if(rtnval == EOF)

{

break;

}

else

{

szLine[i++] = rtnval;

}

if(rtnval == '\\n')

{

#ifndef WIN32

i--;

#endif

szLine[--i] = '\\0';

i = 0;

tmp = strchr(szLine, '=');

if(( tmp != NULL )&&(flag == 1))

{

if(strstr(szLine,key)!=NULL)

{

//注释行

if ('#' == szLine[0])

{

}

else if ( '\\/' == szLine[0] && '\\/' == szLine[1] )

{

}

else

{

//找打key对应变量

strcpy(tmpstr,tmp+1);

fclose(fp);

return tmpstr;

}

}

}

else

{

strcpy(tmpstr,"[");

strcat(tmpstr,title);

strcat(tmpstr,"]");

if( strncmp(tmpstr,szLine,strlen(tmpstr)) == 0 )

{

//找到title

flag = 1;

}

}

}

}

fclose(fp);

return "";

}

//从INI文件读取整类型数据

int GetIniKeyInt(char *title,char *key,char *filename)

{

return atoi(GetIniKeyString(title,key,filename));

}

int main(int argc,char* argv[])

{

char buf[MAX_PATH];

memset(buf,0,sizeof(buf));

GetCurrentPath(buf,CONF_FILE_PATH);

strcpy(g_szConfigPath,buf);

int iCatAge;

char szCatName[32];

iCatAge = GetIniKeyInt("CAT","age",g_szConfigPath);

strcpy(szCatName,GetIniKeyString("CAT","name",g_szConfigPath));

return 0;

}

?

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

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151
#define CONF_FILE_PATH "Config.ini"

#include <string.h>

#ifdef WIN32

#include <Windows.h>

#include <stdio.h>

#else

#define MAX_PATH 260

#include <unistd.h>

#include <fcntl.h>

#include <stdio.h>

#include <stdlib.h>

#include <stdarg.h>

#endif

char g_szConfigPath[MAX_PATH];

//获取当前程序目录

int GetCurrentPath(char buf[],char *pFileName)

{

#ifdef WIN32

GetModuleFileName(NULL,buf,MAX_PATH);

#else

char pidfile[64];

int bytes;

int fd;

sprintf(pidfile, "/proc/%d/cmdline", getpid());

fd = open(pidfile, O_RDONLY, 0);

bytes = read(fd, buf, 256);

close(fd);

buf[MAX_PATH] = '\\0';

#endif

char * p = &buf[strlen(buf)];

do

{

*p = '\\0';

p--;

#ifdef WIN32

} while( '\\\\' != *p );

#else

} while( '/' != *p );

#endif

p++;

//配置文件目录

memcpy(p,pFileName,strlen(pFileName));

return 0;

}

//从INI文件读取字符串类型数据

char *GetIniKeyString(char *title,char *key,char *filename)

{

FILE *fp;

char szLine[1024];

static char tmpstr[1024];

int rtnval;

int i = 0;

int flag = 0;

char *tmp;

if((fp = fopen(filename, "r")) == NULL)

{

printf("have no such file \\n");

return "";

}

while(!feof(fp))

{

rtnval = fgetc(fp);

if(rtnval == EOF)

{

break;

}

else

{

szLine[i++] = rtnval;

}

if(rtnval == '\\n')

{

#ifndef WIN32

i--;

#endif

szLine[--i] = '\\0';

i = 0;

tmp = strchr(szLine, '=');

if(( tmp != NULL )&&(flag == 1))

{

if(strstr(szLine,key)!=NULL)

{

//注释行

if ('#' == szLine[0])

{

}

else if ( '\\/' == szLine[0] && '\\/' == szLine[1] )

{

}

else

{

//找打key对应变量

strcpy(tmpstr,tmp+1);

fclose(fp);

return tmpstr;

}

}

}

else

{

strcpy(tmpstr,"[");

strcat(tmpstr,title);

strcat(tmpstr,"]");

if( strncmp(tmpstr,szLine,strlen(tmpstr)) == 0 )

{

//找到title

flag = 1;

}

}

}

}

fclose(fp);

return "";

}

//从INI文件读取整类型数据

int GetIniKeyInt(char *title,char *key,char *filename)

{

return atoi(GetIniKeyString(title,key,filename));

}

int main(int argc, char* argv[])

{

char buf[MAX_PATH];

memset(buf,0,sizeof(buf));

GetCurrentPath(buf,CONF_FILE_PATH);

strcpy(g_szConfigPath,buf);

int iCatAge;

char szCatName[32];

iCatAge = GetIniKeyInt("CAT","age",g_szConfigPath);

strcpy(szCatName,GetIniKeyString("CAT","name",g_szConfigPath));

return 0;

}

下边是配置文件:

?

1

2

3
[CAT]

age=2

name=Tom

如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

快网idc优惠网 建站教程 C 读取ini文件的实例详解 https://www.kuaiidc.com/72934.html

相关文章

发表评论
暂无评论