Во-первых, вы не хотите использовать while (!feof(pFile))
- никогда!Это почти неизбежно приведет к ошибке, когда последние данные, которые вы прочитали из файла, будут прочитаны дважды.Можно заставить его работать правильно, но только добавив еще одну проверку в середине цикла для выхода при достижении EOF - в этом случае само условие цикла никогда не будет использовано (т. Е. Другой проверкой является та, котораяфактически выполнит работу по выходу из цикла).
Что вы обычно делаете хотите сделать, это проверять EOF, когда вы читаете данные.Различные функции указывают на EOF по-разному.fgets
сигнализирует об ошибке (включая EOF), возвращая NULL.Большинство других (getc, fgetc и т. Д.) Возвращают EOF, поэтому вы обычно получаете что-то вроде этого:
int ch; // Note, this should be int, NOT char
while (EOF != (ch=getc(pFile)))
process(ch);
или:
char buffer[MAX_LINE_SIZE];
while (fgets(buffer, sizeof(buffer), pFile))
process(buffer);
С помощью scanf проверка на успешностьнемного сложнее - он возвращает количество успешных конверсий, поэтому вы хотите убедиться, что он соответствует ожидаемому.Например:
while (1 == fscanf(fPfile, "%d", &input_number))
process(input_number);
В этом случае я использовал 1
, потому что я указал 1 преобразование в строке формата.Однако также возможно, что преобразование завершится неудачей по причинам, отличным от EOF, поэтому, если это не удастся, вам часто нужно проверять feof(pFile)
.Если он возвращает false, сделайте что-то вроде прочтения оставшейся части строки, покажите его пользователю в предупреждающем сообщении, а затем продолжите чтение оставшейся части файла.