无限循环和结构

时间:2016-05-27 12:26:52

标签: c

这是一段代码。基本上,它是在第一个“while”部分计算列表中的学生数量,而不是根据计数分配。并将其保存到struct。 但问题是:首先“while”作为无限循环运行?

int t=0;

FILE *exam;

struct str_examrecords_table
{
    int id_number;
    char result;
};


void Load_examrecords_table(struct str_examrecords_table *examrecords_table)
{
    char temporary_char;
    int temporary_int, i=0;

    exam=fopen("examrecords.odt","r");

    if(exam!=NULL)
    {
        while(fscanf(exam, "%d %c", &temporary_int, &temporary_char)!=EOF)  
        t++;

        examrecords_table = (struct str_examrecords_table *) malloc(sizeof(struct str_examrecords_table) * t);

        while(fscanf(exam, "%d %c", &examrecords_table[i].id_number, &examrecords_table[i].result)!=EOF)    
        i++;
    }
    else exit(1);

    for(int j=0; j<i; j++)  
    printf("%d %c \n", examrecords_table[i].id_number, examrecords_table[i].result);

    fclose(exam);
}


int main()
{
    struct str_examrecords_table   *examrecords_table;
    Load_examrecords_table(examrecords_table);

    system("pause");
    return 0;
}

2 个答案:

答案 0 :(得分:2)

根据this文档,fscanf的返回值表示读取项目的数量,而不是文件的可能结尾。

答案 1 :(得分:2)

来自man

  

如果在第一次成功转换或匹配失败发生之前达到输入结束,则返回值EOF。

  

这些函数返回成功匹配和分配的输入项的数量,可以少于提供的数量,或者在早期匹配失败的情况下甚至为零。

所以改成它:

while(fscanf(exam, "%d %c", &temporary_int, &temporary_char) == 2)