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

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

AB 45.78965 AC 35.46731 BC 46.78695 

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

 #include  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); } 

你的一个问题是你正在使用%[^\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. 您缺少数组图的定义。

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

 #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