从输入文件中提取数据?

时间:2015-10-04 12:55:11

标签: c

我一直坚持这个问题。

我正在创建一个读入输入文件的程序(只是一个普通的.Txt)这个输入文件以下列格式存储变量:

x
21
% This is a comment
y 
3

等等。我的目标是读取此输入文件(完成),然后将文件中的每个变量存储到我的c程序中的全局变量中。即全局变量x将具有值21,y将在我的c文件中具有值3,而忽略注释。

我已经考虑了一段时间,无法弄清楚要使用哪些功能。任何建议都将不胜感激,谢谢。

(请注意,这些变量将始终具有相同的名称,但它们的显示顺序将不同于输入文件到输入文件)。

2 个答案:

答案 0 :(得分:1)

我建议你有一个包含两个字段的结构。

struct Foo
{
  char var_name;
  int var_value;
};

然后创建这些结构的数组,其中包含输入文件中预期变量的大小。

struct Foo input_array[n];

然后,当您阅读文件时,您可以设置结构字段...

for(int i = 0; i < n ; i++){
   input_array[i].var_name = input_var_name;
   input_array[i].var_value = input_var_value;
}

之后您打印了这些值,它们已经按顺序排列。

答案 1 :(得分:1)

首先,我们需要变量将值读入:

int x, y, z /* etc */;

现在,让我们创建一个指针数组,以便我们可以轻松访问变量:

int *array[] = { &x, &y, &z /* etc */ };

现在,我们需要FILE*来访问该文件:

FILE* fp;

打开文件:

fp = fopen("filename.txt", "r"); /* 'r' for reading */

检查文件是否成功打开:

if(fp == NULL)
{
    printf("Error opening file");
    exit(-1); /* Exit the program */
}

现在,使用fscanf

阅读文件
int counter = 0; /* For keeping track of the array index */
for(;;) { /* Infinite loop */
    int retVal = fscanf(fp, "%d", array[counter]); /* Capture return value of fscanf */

    if(retVal == 1) /* Successfully scanned a number */
    {
        counter++;
    }
    else if(retVal == 0) /* Failed to scan a number */
    {
        fscanf(fp, "%*s"); /* Discard a word from the file */
    }
    else /* EOF */
    {
        break; /* Get out of the loop */
    }
}

现在,打印扫描数据:

int i;
for(i = 0; i < counter; i++)
    printf("%d", *array[i]);

最后,关闭文件:

fclose(fp);

完整代码,添加了@ Jongware的建议:

int x, y, z /* etc */;
int *array[] = { &x, &y, &z /* etc */ };

char line[1024];
const char *varNames[] = { "x", "y", "z" };

int tmp = -1;

FILE* fp;
fp = fopen("filename.txt", "r"); /* 'r' for reading */

if(fp == NULL)
{
    printf("Error opening file");
    exit(-1); /* Exit the program */
}


int counter = 0; 
for(fgets(line, sizeof(line), stdin)) { 
    if(line[0] == '%')
        continue;
    else
    {
          tmp = -1;

          for(int i = 0; i < sizeof(varNames) / sizeof(*varNames); i++)
          {
              if(strcmp(line, varNames[i]) == 0)
              {
                  tmp = i;
                  break;
              }
          }

          fgets(line, sizeof(line), stdin);
          sscanf(line, "%d", array[tmp]);
    }
}

int i;
for(i = 0; i < counter; i++)
    printf("%d", *array[i]);

fclose(fp);

以上所有代码均未经测试