我必须解析具有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);
}
答案 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"
之前使用格式中的额外空格来明确跳过空格。
您的代码还有其他一些问题:
您正在使用feof
检查文件结尾。如果您不是逐个字符地读取文件,这通常不会很好。相反,你应该检查你的fscanf
是否返回3,也就是说,如果它成功阅读了你想要阅读的三件事。
您缺少数组graph
的定义。
我正在添加我为编写解析而编写的完整代码:
#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;
}