【问题标题】:reading ini files using fscanf in c在c中使用fscanf读取ini文件
【发布时间】:2016-05-25 17:12:27
【问题描述】:

我在解析 .ini file 时遇到问题。我知道有很多关于这个主题的帖子,我已经阅读了很多。我的inifile只有一个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

【问题讨论】:

  • 我的ini文件里只有一行"font=tahoma.ttf"。
  • 您是否使用调试器逐行检查您的代码?
  • 对不起,我不知道如何调试源代码,所以我使用了 printf("OK");
  • 算法很简单,按行分割 -> 按= 分割 -> 移位结果,得到键,再次移位得到值
  • 1) 学习使用您的调试器!没有像现在这样的时间;)。 2)你的代码有很多潜在的问题,包括(但不限于)char Setting[20],Value[20]。 3)建议:使用fgets()和'strpbrk ( line, "="),就像user3121023建议的那样。

标签: c linux


【解决方案1】:

SefFault 可能是由 Value 之前的 &amp; 引起的,但即使在删除 if 之后,您仍然可以读取超过 20 个字符的 value。并且一些 ini 文件可能包含不符合模式的注释行,会破坏你的程序

你真的应该:

  • 逐行读取fgets到至少255个字符的缓冲区-重复直到文件结束:while (NULL != fgets(line, sizeof(line), stdin)) { ...}
  • 使用sscanf 解析每一行并忽略每一个不符合的行:

    if (2 == sscanf(line, "%19[^=]=%19s", Setting, Value) { ... }
    

【讨论】:

  • 好吧,我发现了,并为它分配了一些内存。感谢您的回复!
【解决方案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);
    }
}

【讨论】:

  • 我从你那里学到了一些新东西。无论如何感谢您的回复!
猜你喜欢
  • 2011-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多