возвращаемое значение 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.

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

5 ответов


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

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

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


цитирую cplusplus.com .

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

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

-- EDIT--

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

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

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

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

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


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

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

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

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

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

надеюсь, что это помогает.


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