读取配置⽂件的C语⾔接⼝实现
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <ctype.h>
4 #include <direct.h>
5#define MAX_LINE_LENGTH 256
6
读取配置文件失败7int read_line(FILE *fp, char *bp)
8 {
9char c = '\0';
10int i = 0;
11bool isAssgin = 0;
12/* Read one line from the source file */
13while (1)
14 {
15 c = getc(fp);
16if (c == '\n')
17 {
18break;
19 }
20
21if (c == '\r')
22 {
23continue;
24 }
25
26if (c == '=')
27 {
28 isAssgin = 1;
29 }
30
31if (feof(fp))
32 {
33/* return FALSE on unexpected EOF */
34if (isAssgin == 1)
35 {
36 bp[i] = '\0';
37return(1);
38 }
39else
40 {
41return(0);
42 }
43 }
44 bp[i++] = c;
45 }
46 bp[i] = '\0';
47return(1);
48 }
49/************************************************************************
50* Function: Get_private_profile_int()
51* Arguments: <char *> section - the name of the section to search for
52* <char *> entry - the name of the entry to find the value of
53* <int> def - the default value in the event of a failed read
54* <char *> file_name - the name of the .ini file to read from
55* Returns: the value located at entry
56*************************************************************************/
57int Get_private_profile_int(const char *section, const char *entry, int def, char *file_name)
58 {
59 FILE *fp = fopen(file_name, "r");
60//Try to fix the issue that the MAX_PATH should be 256, not 80
61char buff[MAX_LINE_LENGTH];
62char *ep;
63char t_section[MAX_LINE_LENGTH];
64char value[12];
65int len = strlen(entry);
66int i;
67//To support negative number convert
68bool b_IsNegative = false;
69if (!fp)
70 {
71return(0);
72 }
73 sprintf(t_section, "[%s]", section); /* Format the section name */
74/* Move through file 1 line at a time until a section is matched or EOF */
75do
77if (!read_line(fp, buff))
78 {
79 fclose(fp);
80return(def);
81 }
82 }while (strcmp(buff, t_section));
83/* Now that the section has been found, find the entry.
84 * Stop searching upon leaving the section's area. */
85do
刘欢的老婆86 {
87if (!read_line(fp, buff) || buff[0] == '[') //130516 Willy modify '\0' to '[' for parser ini bug.
88 {
89 fclose(fp);
90return(def);
91 }
92 }while (strncmp(buff, entry, len));
93
94 ep = strrchr(buff, '='); /* Parse out the equal sign */
95 ep++;
96if (!strlen(ep)) /* No setting? */
97 {psp真三国无双6攻略
98return(def);
99 }
100/* Copy only numbers fail on characters */
101//To support negative number convert
102if (ep[0] == '-')
103 {
104 b_IsNegative = true;
105for (i = 1; isdigit(ep[i]); i++)
106 {
107 value[i - 1] = ep[i];
108 }
109 value[--i] = '\0';
110 }
111else
112 {
113for (i = 0; isdigit(ep[i]); i++)
114 {
115 value[i] = ep[i];
116 }
117 value[i] = '\0';
118 }
119 fclose(fp); /* Clean up and return the value */
120//To support negative number convert
121if (b_IsNegative)
122 {
123return (0 - atoi(value));
124 }
125else
126 {
127return(atoi(value));
128 }
129 }
130
131
132 unsigned long long Get_private_profile_longlong(const char *section, const char *entry, unsigned long long def, char *file_name) 133 {
134 FILE *fp = fopen(file_name, "r");
135char buff[MAX_LINE_LENGTH];
136char *ep;
137char t_section[MAX_LINE_LENGTH];
138char value[16];
139int len = strlen(entry);
140int i;
141if (!fp)
142 {
143return(0);
144 }
145 sprintf(t_section, "[%s]", section); /* Format the section name */
146/* Move through file 1 line at a time until a section is matched or EOF */
147do
148 {
149if (!read_line(fp, buff))
150 {
151 fclose(fp);
152return(def);
153 }
154 }while (strcmp(buff, t_section));
155/* Now that the section has been found, find the entry.
156 * Stop searching upon leaving the section's area. */
157do
158 {
159if (!read_line(fp, buff) || buff[0] == '[') //130516 Willy modify '\0' to '[' for parser ini bug.
161 fclose(fp);
162return(def);
163 }
164 }while (strncmp(buff, entry, len));
165
166 ep = strrchr(buff, '='); /* Parse out the equal sign */
167 ep++;
168if (!strlen(ep)) /* No setting? */
169 {
170return(def);
171 }
172/* Copy only numbers fail on characters */
173for (i = 0; isdigit(ep[i]); i++)
174 {
175 value[i] = ep[i];
176 }
177 value[i] = '\0';
178 fclose(fp); /* Clean up and return the value */
179return(_atoi64(value));
180 }
181
182/**************************************************************************烫发类型
183* Function: Get_private_profile_string()
184* Arguments: <char *> section - the name of the section to search for
185* <char *> entry - the name of the entry to find the value of
186* <char *> def - default string in the event of a failed read
187* <char *> buffer - a pointer to the buffer to copy into
188* <int> buffer_len - the max number of characters to copy
189* <char *> file_name - the name of the .ini file to read from
190* Returns: the number of characters copied into the supplied buffer
191***************************************************************************/
192int Get_private_profile_string(const char *section, const char *entry, const char *def, char *buffer, int buffer_len, char *file_name) 193 {
194
195 FILE *fp = fopen(file_name, "r");
196char buff[MAX_LINE_LENGTH];
197char *ep;
198char t_section[MAX_LINE_LENGTH];
199int len = strlen(entry);
200if (!fp)
201 {
202return(0);
203 }
204 sprintf(t_section, "[%s]", section); /* Format the section name */
205/* Move through file 1 line at a time until a section is matched or EOF */
206do
207 {
208if (!read_line(fp, buff))
209 {
210 strncpy(buffer, def, buffer_len);
211return(strlen(buffer));
212 }
213 }while (strcmp(buff, t_section));
214/* Now that the section has been found, find the entry.
215 * Stop searching upon leaving the section's area. */
216do
217 {
218if (!read_line(fp, buff) || buff[0] == '[') //130516 Willy modify '\0' to '[' for parser ini bug.
219 {
220 fclose(fp);
221 strncpy(buffer, def, buffer_len);
222return(strlen(buffer));
223 }
224 }while (strncmp(buff, entry, len));
225
226 ep = strrchr(buff, '='); /* Parse out the equal sign */
227do
228 {
229 ep++;
230 }while(!strncmp(ep, "", 1)); //Remove the blank space
231
232/* Copy up to buffer_len chars to buffer */
233 strncpy(buffer, ep, buffer_len - 1);
234 buffer[buffer_len - 1] = '\0';
235 fclose(fp); /* Clean up and return the amount copied */
236return(strlen(buffer));
237 }
238int Get_private_profile_hex(const char *section, const char *entry, int def, char *file_name)
239 {
240char valBuf[16], valBuf2[16];
241int data;
242
243 memset(valBuf, 0, sizeof(valBuf));
245
246 sprintf(valBuf2, "0x%x", def);
247 Get_private_profile_string(section, entry, valBuf2, &valBuf[0], sizeof(valBuf), file_name);
248 data = 0;
249 sscanf(valBuf, "0x%x", &data);
250return data;
251 }
252
253/*************************************************************************
254 * Function: Write_private_profile_string()
255 * Arguments: <char *> section - the name of the section to search for
256 * <char *> entry - the name of the entry to find the value of
257 * <char *> buffer - pointer to the buffer that holds the string
258 * <char *> file_name - the name of the .ini file to read from
259 * Returns: TRUE if successful, otherwise FALSE
260 *************************************************************************/
261int Write_private_profile_string(const char *section, const char *entry, char *buffer, char *file_name) 262 {
263 FILE *rfp, *wfp;
264char tmp_name[15];
265//Try to fix the issue that the MAX_PATH should be 256, not 80
266char buff[MAX_LINE_LENGTH];
267char t_section[MAX_LINE_LENGTH];
268int len = strlen(entry);
269 tmpnam(tmp_name); /* Get a temporary file name to copy to */
270 sprintf(t_section, "[%s]", section); /* Format the section name */
271
272 rfp = fopen(file_name, "r");
273if (!rfp) /* If the .ini file doesn't exist */
274 {
275 wfp = fopen(file_name, "w");
276if (!wfp) /* then make one */
277 {
278return(0);
279 }
280 fprintf(wfp, "%s\n", t_section);
281 fprintf(wfp, "%s=%s\n", entry, buffer);
282 fclose(wfp);
283return(1);
284 }
285
286 wfp = fopen(tmp_name, "w");
287if (!wfp)
288 {
289 fclose(rfp);
290return(0);
291 }
292
293/* Move through the file one line at a time until a section is
294 * matched or until EOF. Copy to temp file as it is read. */
295do
296 {
297if (!read_line(rfp, buff))
298 {
299/* Failed to find section, so add one to the end */
300 fprintf(wfp, "\n%s\n", t_section);
301 fprintf(wfp, "%s=%s\n", entry, buffer);
302/* Clean up and rename */
303 fclose(rfp);
304 fclose(wfp);
305 unlink(file_name);
306 rename(tmp_name, file_name);
307return(1);
308 }
309 fprintf(wfp, "%s\n", buff);
310 }while (strcmp(buff, t_section));
311
312/* Now that the section has been found, find the entry. Stop searching
313 * upon leaving the section's area. Copy the file as it is read
314 * and create an entry if one is not found. */
315while (1)
316 {
317if (!read_line(rfp, buff))
318 {
319/* EOF without an entry so make one */
320 fprintf(wfp, "%s=%s\n", entry, buffer);
321/* Clean up and rename */
322 fclose(rfp);
323 fclose(wfp);
324 unlink(file_name);
325 rename(tmp_name, file_name);
326return(1);
327
329if (!strncmp(buff, entry, len) || buff[0] == '\0')
330 {
331break;
332 }
333 fprintf(wfp, "%s\n", buff);
电脑可以用吗334 }
335
336if (buff[0] == '\0')
337 {
338 fprintf(wfp, "%s=%s\n", entry, buffer);
339do
怀孕被辞退340 {
341 fprintf(wfp, "%s\n", buff);
342 }
343while (read_line(rfp, buff));
344 }
345else
346 {
347 fprintf(wfp, "%s=%s\n", entry, buffer);
348while (read_line(rfp, buff))
349 {
350 fprintf(wfp, "%s\n", buff);
351 }
352 }
353/* Clean up and rename */
354 fclose(wfp);
355 fclose(rfp);
356 unlink(file_name);
357 rename(tmp_name, file_name);
358return(1);
359 }
360
361int Write_private_profile_int(const char *section, const char *entry, int data, char *file_name)
362 {
363char valBuf[16];
364 memset(valBuf, 0, 16);
365 sprintf(valBuf, "%d", data);
366return Write_private_profile_string(section, entry, valBuf, file_name);
367 }
368
369 unsigned long long Write_private_profile_longlong(const char *section, const char *entry, unsigned long long data, char *file_name)
370 {
371char valBuf[16];
372 memset(valBuf, 0, 16);
373 sprintf(valBuf, "%Lu", data);
374return Write_private_profile_string(section, entry, valBuf, file_name);
375 }
ConfigFile.h
1 #ifndef _CONFIGFILE_H_
2#define _CONFIGFILE_H_
3
4extern int Get_private_profile_int(const char *section, const char *entry, int def, char *file_name);
5extern unsigned long long Get_private_profile_longlong(const char *section, const char *entry, unsigned long long def, char *file_name);
6extern int Get_private_profile_string(const char *section, const char *entry, const char *def, char *buffer, int buffer_len, char *file_name); 7extern int Get_private_profile_hex(const char *section, const char *entry, int def, char *file_name);
8
9extern int Write_private_profile_string(const char *section, const char *entry, char *buffer, char *file_name);
10extern int Write_private_profile_int(const char *section, const char *entry, int data, char *file_name);
11extern unsigned long long Write_private_profile_longlong(const char *section, const char *entry, unsigned long long data, char *file_name); 12
13#endif//_CONFIGFILE_H_
测试:
当前⽬录下Autoconfig.ini⽂件的内容为
测试源码:main.c
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <ctype.h>
4 #include <direct.h>
5 #include "GetConfig.h"
6#define DEFAULT_INI_FILE "\\Autoconfig.ini"
7
8int main(int argc, char* argv[])
9 {
10char ProductModel[80];
11char iniFile[256];
发布评论