【问题标题】:How To access an Array from a ini file in C?如何从 C 中的 ini 文件访问数组?
【发布时间】:2015-10-02 18:56:05
【问题描述】:

我创建了一个如下所示的 .ini 文件:

[one]
heading=" available state";
name=['A', 'D', 'H'];

[two]
type= ["on", "off", "switch"];

访问这个ini文件的主C程序如下所示:

#include <stdio.h>
#include <Windows.h>

int main ()
{

   LPCSTR ini = "C:\coinfiguration.ini";

   char returnValue1[100];
   char returnValue2[100];
   GetPrivateProfileString("states", "title", 0, returnValue1, 100, ini);
   GetPrivateProfileString("reaction", "reac_type", 0, returnValue2, 100, ini);

   printf(returnValue2[10]);

   printf("%s \n" ,returnValue1);
   printf(returnValue2);



   return 0;

}

我能够显示第一组的整个标题以及整个数组名称。但不是像这样显示整个数组(名称)

['A', 'D', 'H']; 

我只想显示术语“A”。 同样对于第二节而不是这个

["on", "off", "switch"];

我只想把“打开”。 我想不出办法来做到这一点。有人可以帮帮我吗?

【问题讨论】:

  • 所谓的INI files 没有“数组”或列表或任何此类数据。像您展示的“数组”是特定于应用程序的,您需要自己解析它。
  • @Joachim Pileborg:感谢您的回复。但是你能告诉我如何解析它吗?提前谢谢..

标签: c configuration ini


【解决方案1】:

INI 文件非常简单,没有数组之类的东西,你必须自己拆分字符串。

幸运的是,这很容易(让我假设我们可以省略 [],因为它们没有为本示例添加任何内容):

char* buffer = strtok(returnValue1, ",");

for (int i=0; i <= itemIndex && NULL != buffer; ++i) {
    buffer = strtok(NULL, ",");
    while (NULL != buffer && ' ' == *buffer)
        ++buffer;
}

if (NULL != buffer) { // Not found?
    printf("%s\n", buffer);

    if (strcmp(buffer, "'A'") == 0)
        printf("It's what I was looking for\n");
}

对于字符串修整([、空格和最终引号的机器人),您可以使用来自How do I trim leading/trailing whitespace in a standard way? 的代码。

(请注意代码未经测试)

【讨论】:

  • 我认为您最好在获取下一个令牌之前调用“修剪”循环并打印buffer(或以某种方式保存)(否则您不会对第一个令牌执行任何操作)。循环调用 UB 之后的 printf() 因为 buffer 很可能是 NULL 这里
  • @IngoLeonhardt 它非常具有说明性,您应该检查 NULL 但它可能(应该!)不是因为 itemIndex (您要提取的“向量”项目的索引)。它只提取一个项目。
  • @AdrianoRepetti:谢谢你 :) 我还有一个 qn.. 现在收到字母 'A' 、 'H' 或 'D' 后,如果我需要检查该怎么办缓冲区的内容并验证它包含的字母是“A”(可能带有 if 语句)。
  • 你没有单个字符那么你必须执行一个字符串比较,我用一个小例子更新答案。
【解决方案2】:

一种 解决您的问题的方法是自己解析它(这实际上是 only 的方法),解析它的一种方法是这样的:

  1. 删除前导和尾随 '['']'(分别阅读 strchrstrrchr 函数)
  2. 用逗号分割剩余的字符串','(阅读strtok函数)
  3. 对于每个子字符串,删除前导和尾随空格(了解isspace 函数)
  4. 您现在有了值,可以将它们放入列表或字符串数​​组中

【讨论】:

    猜你喜欢
    • 2015-10-06
    • 2011-01-02
    • 1970-01-01
    • 2015-11-17
    • 2021-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-12
    • 2013-11-08
    相关资源
    最近更新 更多