Похоже, что fgets читает остальные записи, а затем сохраняет их все в одной строке.
blockquote>Да,
'\r'
не является терминатором строки. Поэтому, когдаfscanf
перестает разбираться с первым недопустимым символом и оставляет их в буфере, тогдаfgets
будет читать их до конца строки. И поскольку в файле нет допустимых терминаторов строк, то есть до конца файла.Вероятно, вы должны исправить файл, чтобы иметь окончательные строки (Unix?), Например, с подходящим текстовым редактором, который может сделай это. Но это еще один вопрос, который был задан раньше (например, здесь ) и зависит от деталей, не включенных в ваш вопрос.
Кроме того, вам нужна двойная проверка для
fscanf
возвращаемое значение. Используйтеperror
, только если возвращаемое значение равно -1, в противном случае сообщение об ошибке вообще не будет связано с ошибкой. Если возвращаемое значение равно>=0
, но отличается от того, что вы хотели, тогда напечатайте собственное сообщение об ошибке «недопустимый синтаксис ввода» или что угодно (и, возможно, используйтеfgets
для чтения остальной части строки из буфера).Кроме того, чтобы надежно смешивать
scanf
иfgets
, мне нужно добавить пробел в строку форматаfscanf
, чтобы он считывал любые пробелы в конце строки (также в начале следующей строки и любые пустые строки, поэтому будьте осторожны, если это имеет значение):
int items_read = scanf("%d ", &intvalue);
Как указано в другом ответе, лучше всего читать строки только с помощью
fgets
, затем проанализируйте их с помощьюsscanf
по очереди.