我在解析.ini
file
时遇到问题。我知道有很多关于这个主题的帖子,我已经阅读了很多这些帖子。我的ini
file
只有一个entry
:
font=tahoma.ttf
源代码:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
static FILE *ini_file;
char font[20];
void LoadConfig()
{
char Setting[20],Value[20];
int EndOfFile = 0;
if ((ini_file = fopen("config.ini", "r")))
{
EndOfFile = fscanf(ini_file, "%[^=]=%s", Setting, &Value);
while (EndOfFile != EOF)
{
if(strcmp(Setting,"font") == 0)
{
strcpy(font,Value);
}
EndOfFile = fscanf(ini_file, "%[^=]=%s", Setting, &Value);
}
fclose(ini_file);
}
}
问题是,该值永远不会读入font
variable
。
答案 0 :(得分:3)
SefFault可能由Value之前的&
引起,但即使在删除之后,您仍然可以读取超过20个字符的值。并且一些ini文件可以包含不遵循该模式的注释行,并且会打破你的progran
你真的应该:
fgets
到至少255个字符的缓冲区 - 重复到文件末尾:while (NULL != fgets(line, sizeof(line), stdin)) { ...}
使用sscanf
解析每一行并忽略每一行不符合的行:
if (2 == sscanf(line, "%19[^=]=%19s", Setting, Value) { ... }
答案 1 :(得分:2)
使用fgets读取文件中的每一行。 strpbrk可用于定位等号和换行符,并将该字符跨度复制到变量中。
void LoadConfig()
{
char Setting[100] = {'\0'},Value[100] = {'\0'}, line[300] = {'\0'};
size_t span = 0;
if ((ini_file = fopen("config.ini", "r")))
{
while ( fgets ( line, sizeof ( line), ini_file))//read each line
{
char *equal = strpbrk ( line, "=");//find the equal
if ( equal)//found the equal
{
span = equal - line;
memcpy ( Setting, line, span);
Setting[span] = '\0';
if(strcmp(Setting,"font") == 0)
{
equal++;//advance past the =
char *nl = strpbrk ( equal, "\n");//fine the newline
if ( nl)//found the newline
{
span = nl - equal;
memcpy ( font, nl, span);
font[span] = '\0';
}
}
}
}
fclose(ini_file);
}
}