Прочитайте файл с помощью fscanf и после него fgets [duplicate]

Использовать Kint. Это комбинация команд отладки на стероидах. https://kint-php.github.io/kint/ Он очень похож на Nette Tracy

2
задан alk 16 October 2013 в 07:03
поделиться

3 ответа

Похоже, что fgets читает остальные записи, а затем сохраняет их все в одной строке.

Да, '\r' не является терминатором строки. Поэтому, когда fscanf перестает разбираться с первым недопустимым символом и оставляет их в буфере, тогда fgets будет читать их до конца строки. И поскольку в файле нет допустимых терминаторов строк, то есть до конца файла.

Вероятно, вы должны исправить файл, чтобы иметь окончательные строки (Unix?), Например, с подходящим текстовым редактором, который может сделай это. Но это еще один вопрос, который был задан раньше (например, здесь ) и зависит от деталей, не включенных в ваш вопрос.

Кроме того, вам нужна двойная проверка для fscanf возвращаемое значение. Используйте perror, только если возвращаемое значение равно -1, в противном случае сообщение об ошибке вообще не будет связано с ошибкой. Если возвращаемое значение равно >=0, но отличается от того, что вы хотели, тогда напечатайте собственное сообщение об ошибке «недопустимый синтаксис ввода» или что угодно (и, возможно, используйте fgets для чтения остальной части строки из буфера).

Кроме того, чтобы надежно смешивать scanf и fgets, мне нужно добавить пробел в строку формата fscanf, чтобы он считывал любые пробелы в конце строки (также в начале следующей строки и любые пустые строки, поэтому будьте осторожны, если это имеет значение):

int items_read = scanf("%d ", &intvalue);

Как указано в другом ответе, лучше всего читать строки только с помощью fgets , затем проанализируйте их с помощью sscanf по очереди.

1
ответ дан Community 21 August 2018 в 23:58
поделиться
  • 1
    Я воссоздал входной файл в gvim. Добавление пробела в строку формата fscanf привело к трюку. Благодаря! – kaozgamer 14 October 2013 в 17:22

Строка, которую вы видите при запуске GDB, действительно заканчивается на первом нулевом символе:

"\rtest\r18/04/2010\rtest2\r03/05/2010\rtest3\r05/08/2009\rtest4\r\n\000"

Остальные данные после игнорируются (при использовании обычных str-функций);

0
ответ дан Atle 21 August 2018 в 23:58
поделиться

Не смешивайте fscanf() и fgets(), так как первый может оставить материал в буфере потока.

Для линейно-ориентированного формата читайте только полные строки, используя fgets(), затем использовать, например sscanf(), чтобы разобрать то, что вы прочитали.

1
ответ дан unwind 21 August 2018 в 23:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: