【问题标题】:Structures Program not working as intended (Bug)结构程序未按预期工作(错误)
【发布时间】:2021-05-04 08:13:08
【问题描述】:

我一直在从一个文件中读取数据,该文件包含学生姓名和年龄,格式为:

约翰

12

13

朱莉娅

18

这是我写的程序:

  #include <stdio.h>
    #include <stdlib.h>
    struct record{
        char name[50];
        int age;
    };
    int main(){
        FILE *fp;
        fp=fopen("sample2.txt","r");
        struct record a[50];
        int counter=1;
        int i=0;
        while (!EOF){
        if (counter%2!=0){
            fgets(a[i].name,50,fp);
            counter++;
        }
        if (counter%2==0){
            a[i].age=getw(fp);
            counter++;
            i++;
        }
    }
    return 0;
    }

但是,在打印 a[0].name 时,我没有得到预期的输出。有人可以帮忙吗?

【问题讨论】:

  • EOF 是在&lt;stdio.h&gt; 中定义的负常数,通常为-1。它不为零,所以它始终为真,!EOF 始终为假——您的程序不会进入循环。读取年龄时还有另一个问题:getw 读取(原始/二进制)机器字。用fgets 读取一行,然后用strtolatoi 将其转换为整数。
  • 'counter' 毫无意义。您应该检查 getw 的作用。假设“12”是文件中的 ascii 而不是一个单词,后跟一个换行符。 => 所以这是你的问题。你可以改用 fgets() + atoi()。最佳做法是在您阅读时使用特殊日志打印内容,以便您更清楚。
  • @MOehm 我明白了你的观点,但我不知道如何编辑 while 循环,以便只要未到达文件末尾,循环就可以工作。
  • @MOehm 我无法理解你所说的原始/机器字是什么意思
  • 输入/输出有两种基本模式:原始或二进制数据和文本数据。您的文件是文本文件。文本数据使用fprintffgetsfscanf等。使用 freadfwrite 获取原始数据。 getw 是一个旧函数,它读取四个字节并将它们视为int,作为程序可能会将内存中的四个字节视为int

标签: c file structure


【解决方案1】:

正如 cmets 中已经指出的,EOF 是在 stdio.h 中定义的一个值,并且没有说明您的文件描述符。我还建议您使用 fscanf (只要您确定文件中的名称都是正确的长度)。 fscanf 采用类似于 printf 的字符串,指定您期望的元素并返回可能匹配的数量。它还可以帮助您将数据转换为正确的数据类型。所以代码可能是这样的:

#include <stdio.h>
#include <stdlib.h>
struct record
{
  char name[50];
  int age;
};

int main ()
{
  FILE *fp;
  fp = fopen ("sample2.txt", "r");
  struct record a[50];
  int i = 0;
  while (fscanf(fp, "%s\n%d\n", (char *) a[i].name, &a[i].age) > 0) {
    i++;
  }
  printf("%s %d\n", a[1].name, a[1].age);
  return 0;
} 

【讨论】:

  • &gt; 0 ==> == 2 ,scanf 系列不返回“可能匹配的数量”,它返回正确格式化的 actual 参数的数量和解析。另外,我不确定您认为 (char *)a[i].name 的无关演员正在完成什么,但这不是必需的。 add 是对字符串格式说明符的适当长度限制。 IE。 %49s
猜你喜欢
  • 2018-03-21
  • 1970-01-01
  • 1970-01-01
  • 2015-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-09
  • 2021-08-04
相关资源
最近更新 更多