为什么这段代码只打印文件的第一行?

问题描述

要求:

编写一个按顺序执行以下任务的 C 程序:

  • 最初在执行窗口中显示文件内容
  • 用户询问 ID,在文件搜索 ID,然后以以下格式显示消息(在执行窗口中):Student with ID:………对应于………………。谁是主修……………… 在输出中打印学生姓名时,不要打印“_”!

问题: 它只输出文件的第一行(又名第一个学生信息),之后它甚至不要求提供学生 ID。

代码

array(2) {
  ["apple"]=>
  string(7) "uniqid3"
  ["bannana"]=>
  string(7) "uniqid4"
}

解决方法

有几点:

  1. main 应该返回 int

  2. fscanf(info,"%d",&students[I].ID); // '&' 被遗漏了。

  3. 文件读取循环

    for (i = 0; i

不好。

while(fgets(buff,sizeof(buff),infp)!=NULL){
}

应该会更好。该文件可能有更多或更少的行;

  1. 将 fscanf 与 get 结合起来并不好。请使用 fgets 读取行并使用 sscanf 或 strtok 获取字段。
,

您错过了此行中的 &

fscanf(infp,students[i].ID);

更改为:

fscanf(infp,&students[i].ID);
,

关于:

问题:它只输出文件的第一行(也就是第一个学生信息),之后它甚至不要求提供学生 ID。

感兴趣的代码是

    printf("Enter an ID: ");
    scanf("%d",&ID_to_search);
    index = search_for_student(ID_to_search,students);
    
    if (index == -101)
        printf("Student not found!");
    else {
        printf("Student with ID: %d corresponds to %s %s who is majoring in %s.",students[index].ID,students[index].First_name,students[index].Last_name,students[index].major);
    } 
}  // end if/else,not the end of a `for() loop

注意上面的代码是'else'代码块的结尾,不是for()循环的一部分,所以只会执行一次

此外,如果输入的学生少于 22 人,调用 fscanf() 将返回 EOF 而不是更新任何学生信息。您确定输入文件实际上包含 22 个学生信息实例吗?它甚至包含超过 1 个学生信息实例吗?

而不是使用 22 的硬编码计数,用于:

for (i = 0; i < 22; i++) 
    {
        fscanf(infp,students[i].ID);

建议使用第一次调用 fscanf() 的返回值,类似于:

i = 0;
while( fscanf(infp,students[i].ID) != EOF )
{
    ....
    i++;
}