Intereting Posts
Почему это действительно C Динамический multidimensional array Почему структуры не допускаются в выражениях равенства в C? как изменить заголовок пакета (заголовок IP, заголовок TCP) до того, как хост отправит их в сеть Многоадресная рассылка от ядра к пользовательскому пространству через Netlink в C Ошибка при компиляции функций C для PostgreSQL 9.6 Задачи планирования задач OpenMP Как разрешить конфликты имен файлов в GCC? Тестовый чехол для adcx и adox как проверить статические функции C с помощью google test C, что мне не хватает для этой программы контрольных операторов? Что вы можете сделать в C без «std»? Являются ли они частью «С» или просто библиотек? Почему я получаю странные результаты при чтении массива целых чисел из сокета TCP? C: Улучшение производительности функции с использованием сильного греха () Измените tempdir () в сеансе (обновите R_TempDir)

Возвращаемое значение fscanf

Что возвращает fscanf при чтении данных в файле. Например,

int number1, number2, number3, number4, c; c = fscanf (spFile, "%d", &number1); //c will be 1 in this case. c = fscanf (spFile, "%d %d %d %d", &number1, &number1, &number3, &number4); //in this case, c will return 4. 

Я просто хочу знать, почему он возвращает такие значения в зависимости от количества аргументов.

Из manpage для семейства функций Xscanf :

После успешного завершения эти функции должны возвращать количество успешно согласованных и назначенных элементов ввода ; это число может быть равно нулю в случае неудачного совпадения. Если вход заканчивается до первого совпадающего сбоя или преобразования, возвращается EOF. Если возникает ошибка чтения, устанавливается индикатор ошибки для streamа, возвращается EOF, а значение errno должно указывать на ошибку

Итак, ваш первый вызов fscanf возвращает 1, потому что один элемент ввода ( &number1 ) был успешно сопоставлен с спецификатором формата %d . Второй вызов fscanf возвращает 4, потому что все 4 аргумента были сопоставлены.

Я цитирую cplusplus.com .

При успешном выполнении функция возвращает количество успешно заполненных элементов списка аргументов. Этот счетчик может соответствовать ожидаемому количеству элементов или меньше (даже нулю) из-за соответствия сбоя, ошибки чтения или досягаемости конца файла.

Если при чтении появляется ошибка чтения или завершается конец файла, устанавливается правильный индикатор (feof или ferror). И, если это произойдет до того, как данные будут успешно прочитаны, возвращается EOF.

–РЕДАКТИРОВАТЬ–

Если вы намерены определить количество прочитанных байтов в строке.

 int bytes; char str[80]; fscanf (stdin, "%s%n",str,&bytes); printf("Number of bytes read = %d",bytes); 

На странице руководства :

* Эти функции возвращают количество элементов ввода, успешно совпадающих и назначенных, которые могут быть меньше, чем предусмотрено, или даже нуля в случае раннего совпадения. *

Следовательно, 1-й возвращает 1, если способен читать одно целое из файла, а второй возвращает 4, если способен читать 4 целых числа из файла.

Это вопрос очень прямой, и на него был дан правильный ответ Чарльза и был передо мной. Но они не упомянули, где вы должны искать такие вещи в следующий раз, когда застрянете.

сначала вопрос – fscanf принадлежит к семейству функций форматированного ввода (сканирования), которые должны читать ввод и сообщать некоторую информацию о данных, читаемых как байты, или количество элементов (переменные адреса), которые получили соответствующий ввод read и было выполнено успешное присвоение.

здесь fscanf должен проверять совпадения во входном файле с строкой формата, предоставленной в вызове функции, и соответственно назначать (по порядку их позиции) переменную-адрес со значением, а после ее завершения он возвращает общий счетчик для количество успешных заданий. следовательно, результат 1 и следующий был 4 (при условии, что ввод был предоставлен должным образом).

Вторая часть: где искать? – хорошо описанные детали для такой функции легко найти на ваших страницах руководства или posix doc, если вы обратитесь к одному из них.

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

надеюсь это поможет.

Возвращаемое значение не зависит от количества аргументов для fscanf , оно зависит от количества значений, успешно проверенных fscanf .