Member 12890360 Ответов: 3

Fgets не работает - кажется, он возвращает null


void readInfo()
{
    struct grades *grades=malloc(3*sizeof(grades));
    char *line,*str;int i=0;
    FILE *rf=fopen("Grades.txt","r");
    if(rf!=NULL)
    {
        puts("inside if1");
        while(i<3&&fgets(line,60,rf)!=NULL)
        {
            puts("inside while");
            fscanf(rf,"%d %s %c",&((*(grades+i)).ID),str,&((*(grades+i)).grade));i++;
            strcpy(str,((*(grades+i)).course));
            printInfo(grades+i);
        }
    }
}


Что я уже пробовал:

Внезапно fgets перестал работать, в то время как я не сделал никаких изменений, которые повлияют на функцию
пожалуйста, дайте мне знать, почему он не работает !?

Patrice T

Если код не изменился, то, возможно, это Grades.txt файл.

3 Ответов

Рейтинг:
2

Rick York

Чтобы продолжить то, что написал Ричард, вы не должны вызывать fscanf, если вы также вызываете fgets. Вы должны использовать sscanf в буфере, который вы передаете fgets. Кстати говоря, в коде line и str объявлены как указатели символов, но ни к чему не привязаны. Что происходит в результате аварии.


Рейтинг:
1

Richard MacCutchan

Вы звоните в fgets который читает следующую строку из файла. Вы тогда позвоните fscanf- вы уверены, что хотите читать по две строчки каждый раз?
Кроме того, все эти сложные выражения разыменования трудно интерпретировать.


Рейтинг:
0

Patrice T

Цитата:
Fgets не работает - кажется, он возвращает null
Если код не изменился, то, возможно, это Grades.txt файл.

Чтобы убедиться в этом, используйте отладчик.

Вы должны научиться использовать отладчик как можно скорее. Вместо того чтобы гадать, что делает ваш код, пришло время увидеть, как он выполняется, и убедиться, что он делает то, что вы ожидаете.

Отладчик-Википедия, свободная энциклопедия[^]
Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]

Отладчик здесь для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.
В отладчике нет никакой магии, он не находит ошибок, он просто помогает вам. Когда код не делает того, что ожидается, вы близки к ошибке.