【问题标题】:How to use fscanf to take huge input from file into an struct. ANSI C89(90)如何使用 fscanf 从文件中获取大量输入到结构中。 ANSI C89(90)
【发布时间】:2017-11-25 15:15:33
【问题描述】:

我的程序中的某些代码有问题。我需要读取一个文件并将其内容逐行放入一个结构中。该文件大约有 800 行长,当我尝试打印现在应该包含文件内容的结构时,它只打印了大约 30 行应该是的。其余的归档错误或格式错误。这是我现在的函数,我只是在 main 中调用它。我不确定出了什么问题,但可能与我的 malloc 调用有关?

void read_file(void){
 int lines = count_lines(); /*function to count amount of lines in file*/
 FILE *file;
 int i = 0;
 char filename[] = "race.txt";
 file = fopen(filename, "r");
 race_info *race = malloc(sizeof(race_info));
 if (file != NULL) {
    while (i < lines) {
        fscanf(file, " %[A-Za-z]s %[A-Za-z]s %[A-Z]s %d %[A-Z]s %[A-Z]s %d %d",
               race[i].race_name,
               race[i].name,
               race[i].lastname,
               &race[i].age,
               race[i].team,
               race[i].country,
               &race[i].position,
               &race[i].time);
        i++;
    }
 }
 else {
    perror(filename); //print the error message
 }
 for (i = 0; i < lines; i++) {
    printf("%s %s %s %d %s %s %d %d",
          race[i].race_name,
          race[i].name,
          race[i].lastname,
          race[i].age,
          race[i].team,
          race[i].country,
          race[i].position,
          race[i].time);
 }
 fclose(file);
} 

结构体设置如下:

#define MAX_CHAR 100



struct race_info{
  char race_name[MAX_CHAR];
  char name[MAX_CHAR];
  char lastname[MAX_CHAR];
  int age;
  char team[MAX_CHAR];
  char country[MAX_CHAR];
  int position;
  int time;
};
typedef struct race_info race_info;

文件中的行设置为:

RaceName               "Name LASTNAME"                                AGE  TEAM   Country      Position      TIME

目标是打印结构,使所有 800 行都以与文件相同的格式打印。但是在打印时它只打印大约 200 行并且它不会从文件的开头到结尾,而是从文件的中间获取内容。很多行也有错误的格式。

【问题讨论】:

  • 请提供输入输出示例。 count_lines() 是什么?寻求调试帮助的问题(“为什么这段代码不起作用?”)必须包括所需的行为、特定的问题或错误以及在问题本身中重现它所需的最短代码。没有明确问题陈述的问题对其他读者没有用处。请参阅:如何创建minimal reproducible example
  • 你需要检查fscanf的返回值,如果失败则做一些事情。就代码而言,如果其中任何一个调用因输入格式异常而失败,它就会“卡”在那里,尝试读取相同的不正确输入但失败,永远无法访问文件的其余部分。跨度>
  • %[A-Za-z]s 这样的格式可能是错误的。我怀疑你想要%[A-Za-z],没有s。见this recent answer

标签: c struct scanf c89


【解决方案1】:

这个race_info *race = malloc(sizeof(race_info)); 似乎只为单个race_info 分配空间。

您可能应该有malloc(lines * sizeof(race_info)) 以适应所有行。

【讨论】:

  • 感谢您的回复。我试过了,但它只是打印了很多零而不是文本。
  • 那么可能还有其他问题,也许count_lines() 是如何获取行数的?或者,如果某些名称不符合 %[A-Za-z]s 格式?
  • 我认为这两个没有问题,count_lines() 只是返回一个整数,所有名称都符合格式。我和一个朋友谈过,他说这可能与我的内存分配有关,他说我应该尝试使用静态分配。但我不确定我应该怎么做,以及我需要多少内存。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-02
  • 1970-01-01
  • 2010-10-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-22
相关资源
最近更新 更多