0

我必须解析具有 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);
 }
4

1 回答 1

2

您的问题之一是您正在阅读 using %[^\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. 您缺少 array 的定义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;
}
于 2013-10-03T07:16:11.803 回答