在c中使用fscanf读取ini文件

时间:2016-05-25 17:12:28

标签: c linux

我在解析.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

2 个答案:

答案 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);
    }
}