具有不同数据类型的文本文件到结构数组中

时间:2013-10-03 06:16:51

标签: c arrays structure file-processing

我必须解析具有3种不同数据类型的文本文件。我希望它保存在一个包含三个成员的结构数组中。我的文本文件如下所示:

A B 45.78965
A C 35.46731
B C 46.78695

我正在阅读的程序如下,它不起作用。 我做错了什么?

#include <stdio.h>

struct gra {
    char from;
    char to;
    double w;
};

int main ()
{
    FILE *fp = fopen("graph.txt", "r"); 
    int i = 0;
    while (!feof(fp)) {
        fscanf(fp, "%[^\t]", &graph[i].from, &graph[i].to, &graph[i].w);
        i++;
    }
    fclose(fp);
 }

1 个答案:

答案 0 :(得分:2)

你的一个问题是你正在使用%[^\t]读取,它读取字符串,并将结果存储到非字符数组的变量(两个字符和一个双精度数)。

虽然您的问题并不清楚,但您的输入行似乎包含两个字符和一个由一个制表符分隔的实数。如果是这样,您应该使用以下fscanf来阅读它们:

fscanf(fp, "%c\t%c\t%lf\n", &graph[i].from, &graph[i].to, &graph[i].w);

如果你不确定你的字段到底是什么区分,并且你想在它们之间允许任意数量的空白区域,并且在行的开头和结尾都有额外的空格,那么使用:

fscanf(fp, " %c %c%lf\n", &graph[i].from, &graph[i].to, &graph[i].w);

也就是说,在每个"%c"之前使用格式中的额外空格来明确跳过空格。

您的代码还有其他一些问题:

  1. 您正在使用feof检查文件结尾。如果您不是逐个字符地读取文件,这通常不会很好。相反,你应该检查你的fscanf是否返回3,也就是说,如果它成功阅读了你想要阅读的三件事。

  2. 您缺少数组graph的定义。

  3. 我正在添加我为编写解析而编写的完整代码:

    #include"stdio.h"
    #define MAX 100
    
    struct {
      char from, to;
      double w;
    } graph[MAX];
    
    int main ()
    {
      FILE *fp = fopen("graph.txt", "rt");  
      for (int i=0; i<MAX; i++)
        if (fscanf(fp, " %c %c%lf\n", &graph[i].from, &graph[i].to, &graph[i].w) < 3)
          break;
      fclose(fp);
      return 0;
    }