Что возвращает функция fscanf в случае успешной работы
Что возвращает функция fscanf в случае успешной работы
Требования макроса тестирования свойств для glibc (см. feature_test_macros(7)):
ОПИСАНИЕ
Если количество определителей преобразования в format превышает количество параметров указателей, то результат не определён. Если количество параметров указателей превышает количество определителей преобразования, то лишние параметры указатели вычисляются, но игнорируются.
Функция scanf() считывает информацию из стандартного потока ввода stdin; fscanf() считывает информацию из потока, на который указывает stream, а sscanf() считывает информацию из символьной строки, на которую указывает str.
Функция vfscanf() является аналогом vfprintf(3) и читает информацию из потока, на который указывает указатель stream, используя список указателей переменной длины (смотрите stdarg(3)). Функция vscanf() считывает список параметров переменной длины из стандартного ввода, а функция vsscanf() считывает его из строки. Эти функции являются аналогами функций vprintf(3) и vsprintf(3), соответственно.
Строка format состоит из последовательности инструкций (directives), которые описывают порядок обработки входных символов. Если обработка инструкции завершается с ошибкой, то чтение прекращается и scanf() завершает работу. «Отказом» может быть: ошибка ввода, то есть недоступность входных символов или ошибка совпадения, то есть получены неподходящие данные (смотрите далее).
Инструкцией может быть:
Каждый определитель преобразования в format начинается с символа «%» или последовательности символов «%n$» (смотрите о разнице далее) за которым следует:
Определители преобразования в format бывают двух видов: начинающиеся с «%» и начинающиеся с «%n$». Эти два вида не должны использоваться одновременно в строке format, за исключением случая, когда строка, содержащая определители «%n$», может включать %% и %*. Если в format содержатся определители «%», то они задаются в порядке появления параметров указателей, указанных после. В форме «%n$» (есть в POSIX.1-2001, но отсутствует в C99), n — это десятичное целое, которое задаёт в какое место должен быть помещён ввод, то есть указывает на расположение n-го параметра указателя, передаваемого после format.
Преобразования
Доступны следующие определители преобразования:
% Совпадает с литерой «%». То есть %% в строке формата соответствует одиночному символу данных «%». Преобразование не выполняется (но начальные пробельные символы отбрасываются) и назначения не происходит. d Совпадает с необязательным знаковым десятичным целым; следующий указатель должен быть указателем на int. D Эквивалентно ld; оставлено только для обратной совместимости (замечание: есть только в libc4. В libc5 и glibc %D просто игнорируется, что приводит к непонятным ошибкам в старых программах). i Совпадает с необязательным знаковым целым; следующий указатель должен быть указателем на int. Целое считывается как шестнадцатеричное число, если начинается с 0x или 0X, как восьмеричное, если начинается с 0 и как десятичное в остальных случаях. Используются только символы, подходящие для работы с выбранным основанием системы счисления. o Совпадает с необязательным беззнаковым восьмеричным целым; следующий указатель должен быть указателем на unsigned int. u Совпадает с необязательным беззнаковым десятичным целым; следующий указатель должен быть указателем на unsigned int. x Совпадает с необязательным беззнаковым шестнадцатеричным целым; следующий указатель должен быть указателем на unsigned int. X Эквивалентно x. f Совпадает с необязательным знаковым числом с плавающей запятой; следующий указатель должен быть указателем на float. e Эквивалентно f. g Эквивалентно f. E Эквивалентно f. a (C99) Эквивалентно f. s Совпадает с последовательностью непробельных символов; следующий указатель должен указывать на первый элемент массива символов достаточной длины для сохранения входной последовательности и завершающего байта null (‘\0’), который добавляется автоматически. Входная строка обрывается при появлении пробельного символа или достижении максимальной ширины поля, неважно что случится раньше. c Совпадает с последовательностью символов, чья длина задаётся максимальной шириной поля (по умолчанию 1); следующий указатель должен быть указателем на char, и должно быть достаточно места для всех символов (завершающий байт null не добавляется). Обычный пропуск начальных пробелов не выполняется. Чтобы пропустить пробелы, явно укажите их в формате. [ Совпадает с непустой последовательностью символов из задаваемого набора допустимых символов; следующий указатель должен быть указателем на char и должно быть достаточно места для всех символов в строке плюс завершающий байт null. Обычный пропуск начальных пробелов не выполняется. Строка будет состоять (или нет) из символов определённого набора; набор задаётся указанием символов между символом открывающей скобки [ и закрывающей скобки ]. Набором определяются исключающиеся символы, если первым символом после открывающей скобки является символ диакритического знака (^). Чтобы включить закрывающую скобку в набор, укажите её первым символом после открывающей скобки или диакритического знака; в любой другой позиции она закрывает набор. Символ переноса — также является специализированным; если он указывается между двумя символами, то в набор добавляются все лежащие в промежутке символы. Чтобы добавить в набор символ переноса укажите его последним, перед конечной закрывающей скобкой. Например, [^]0-9-] означает, что «все символы, кроме закрывающей скобки, цифр от 0 до 9 и переноса». Строка обрывается при появлении символа не из набора (или, при указании символа диакритического знака, из) или при достижении ширины поля. p Совпадает со значением указателя (как выводится при %p в printf(3)); следующий указатель должен быть указателем на void. n Ничего не ожидается; вместо этого количество символов, использованных к настоящему времени из ввода, сохраняется по следующему указателю, который должен быть указателем на int. Это не преобразование и не увеличивает счётчик, возвращаемый функцией. Назначение может подавляться при указании символа подавления назначения *, но влияние этого на возвращаемое значение не определено. Поэтому преобразования %*n лучше не использовать.
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
Если конец входных данных был достигнут раньше, чем произошло хотя бы одно совпадение или при ошибке совпадения возвращается значение EOF. Значение EOF также возвращается при ошибке чтения; в этом случае для потока устанавливается индикатор ошибки (смотрите ferror(3)), а в errno указывается номер ошибки.
fscanf, _fscanf_l, fwscanf, _fwscanf_l
Считывают форматированные данные из потока. Доступны более безопасные версии этих функций; см. раздел fscanf_s, _fscanf_s_l, fwscanf_s, _fwscanf_s_l.
Синтаксис
Параметры
вышестоящий
Указатель на структуру FILE.
format
Строка управления форматом.
argument
Необязательные аргументы.
locale
Используемый языковой стандарт.
Возвращаемое значение
Каждая из этих функций возвращает количество полей, которые были успешно преобразованы и присвоены; возвращаемое значение не включает поля, которые были считаны, но не были присвоены. Возвращаемое значение 0 указывает, что поля не были назначены. При возникновении ошибки или при достижении конца файлового потока до первого преобразования возвращается значение EOF для fscanf и fwscanf.
Эти функции проверяют свои параметры. Если Stream или Format является пустым указателем, вызывается обработчик недопустимых параметров, как описано в разделе Проверка параметров. Если выполнение может быть продолжено, эти функции возвращают EOF и применяют значениееинвал.
Комментарии
fwscanf — это версия fscanfдля расширенных символов; аргумент формата для fwscanf является строкой расширенных символов. Эти функции ведут себя одинаково, если поток открыт в режиме ANSI. fscanf в настоящее время не поддерживает входные данные из потока Юникода.
Версии этих функций с суффиксом _l идентичны за исключением того, что они используют переданный параметр языкового стандарта вместо локали текущего потока.
Универсальное текстовое сопоставление функций
Подпрограмма TCHAR.H | &Не определено _UNICODE _MBCS | _MBCS определено | _UNICODE определено |
---|---|---|---|
_ftscanf | fscanf | fscanf | fwscanf |
_ftscanf_l | _fscanf_l | _fscanf_l | _fwscanf_l |
Требования
Функция | Обязательный заголовок |
---|---|
fscanf, _fscanf_l | |
fwscanf, _fwscanf_l | или |
Дополнительные сведения о совместимости см. в статье Compatibility.
fscanf
(PHP 4 >= 4.0.1, PHP 5, PHP 7, PHP 8)
fscanf — Обрабатывает данные из файла в соответствии с форматом
Описание
Любой пробельный символ в строке формата эквивалентен любому пробельному символу во входящем потоке. Это означает, что даже табуляция \t в строке формата может быть сопоставлена одному символу пробела во входящем потоке данных.
Каждый вызов fscanf() читает одну строку из файла.
Список параметров
Строка формата состоит из нуля или более директив: обычные символы (за исключением % ), которые просто выводятся без изменения и спецификаторы преобразования, каждый из которых требует передачи своего параметра.
Argnum
Флаг | Описание |
---|---|
— | Выравнивание по левому краю в пределах заданной ширины поля; По умолчанию выравнивание происходит по правому краю. |
+ | Печатает плюс + у не отрицательных чисел; По умолчанию знак печатается только у отрицательных чисел. |
(space) | Дополняет результат пробелами. Это поведение по умолчанию. |
0 | Дополняет числа нулями (только слева). Со спецификатором s также может дополнять нулями справа. |
‘ (char) | Дополняет результат символом (char). |
Ширина
Целое число, определяющее минимальное количество символов, которое будет напечатано.
Точность
Замечание: Если указана точка без последующего значения точности, то точность будет считаться за 0.
Замечание: Попытка использовать спецификатор позиции со значением больше, чем PHP_INT_MAX приведёт к выводу предупреждения.
Если P > X ≥ −4, преобразование будет в стиле «f» и точность будет P − (X + 1). В обратном случае, преобразование будет в стиле «e» и точность будет P − 1.
Спецификатор c игнорирует значения ширины и дополнения
Попытка использовать спецификаторы с указанием ширины для строки в многобайтовой кодировке может привести к неожиданным результатам.
Необязательные присваиваемые значения.
Возвращаемые значения
Если в функцию переданы только два аргумента, обработанные значения будут возвращены в виде массива. В ином случае, если были переданы необязательные аргументы, функция вернёт количество присвоенных значений. Необязательные аргументы должны быть переданы по ссылке.
Примеры
Пример #1 Пример использования функции fscanf()
Пример #2 Содержимое файла users.txt
Смотрите также
Технология программирования на Си: представление матриц, работа с файлами и с текстами
Работа с файлами
Открытие файла: функция fopen
Прототип функции открытия файла выглядит следующим образом:
Значения символов в строке mode сведены в следующую таблицу:
r | Открыть существующий файл на чтение |
w | Открыть файл на запись. Старое содержимое файла теряется, в случае отсутствия файла он создаётся. |
a | Открыть файл на запись. Если файл существует, то запись производится в его конец. |
t | Открыть текстовый файл. |
b | Открыть бинарный файл. |
+ | Разрешить и чтение, и запись. |
Несколько примеров открытия файлов:
Константа NULL
Диагностика ошибок: функция perror
Функция perror печатает сначала пользовательское сообщение об ошибке, затем после двоеточия системное сообщение. Например, при выполнении приведенного фрагмента в случае ошибки из-за отсутствия файла будет напечатано
Функции бинарного чтения и записи fread и fwrite
Функция чтения fread имеет следующий прототип:
В этом примере файл » tmp.dat » открывается на чтение как бинарный, из него читается 100 вещественных чисел размером 8 байт каждое. Функция fread возвращает реальное количество прочитанных чисел, которое меньше или равно, чем 100.
Функция fread читает информацию в виде потока байтов и в неизменном виде помещает ее в память. Следует различать текстовое представление чисел и их бинарное представление! В приведенном выше примере числа в файле должны быть записаны в бинарном виде, а не в виде текста. Для текстового ввода чисел надо использовать функции ввода по формату, которые будут рассмотрены ниже.
Такое представление текстовых файлов восходит к тем уже далеким временам, когда еще не было компьютерных мониторов и для просмотра текста использовались электрифицированные пишущие машинки или посимвольные принтеры. Текстовый файл фактически представлял собой программу печати на пишущей машинке и, таким образом, содержал команды возврата каретки и продергивания бумаги в конце каждой строки.
Закрытие файла: функция fclose
Для закрытия файла используется функция fclose с прототипом
Пример: подсчет числа символов и строк в текстовом файле
Пример выполнения программы: она применяется к собственному тексту, записанному в файле «wc.cpp.
Форматный ввод-вывод: функции fscanf и fprintf
Прототип функции fscanf выглядит следующим образом:
Многоточие здесь означает, что функция имеет переменное число аргументов, большее двух, и что количество и типы аргументов, начиная с третьего, произвольны. На самом деле, фактические аргументы, начиная с третьего, должны быть указателями на вводимые переменные. Несколько примеров использования функции fscanf :
Функция fscanf возвращает число успешно введенных элементов. Таким образом, возвращаемое значение всегда меньше или равно количеству процентов внутри форматной строки (которое равно числу фактических аргументов минус 2).
%d | вывод целого десятичного числа |
%10d | вывод целого десятичного числа, для записи числа отводится 10 позиций, запись при необходимости дополняется пробелами слева |
%lf | вывод вещественного число типа double в форме с фиксированной десятичной точкой |
%.3lf | вывод вещественного число типа double с печатью трёх знаков после десятичной точки |
%12.3lf | вывод вещественного число типа double с тремя знаками после десятичной точки, под число отводится 12 позиций |
%c | вывод одного символа |
%s | конец строки, т.е. массива символов. Конец строки задается нулевым байтом |
Прототип функции fprintf выглядит следующим образом:
В результате выполнения этой программы в файл «tmp.dat» будет записан следующий текст:
Понятие потока ввода или вывода
В операционной системе Unix и в других системах, использующих идеи системы Unix (например, MS DOS и MS Windows), применяется понятие потока ввода или вывода. Поток представляет собой последовательность байтов. Различают потоки ввода и вывода. Программа может читать данные из потока ввода и выводить данные в поток вывода. Программы можно запускать в конвейере, когда поток вывода первой программы является потоком ввода второй программы и т.д. Для запуска двух программ в конвейере используется символ вертикальной черты | между именами программ в командной строке. Например, командная строка
перенаправляет выходной поток программы abcd в файл «tmp.res», т.е. данные будут выводиться в файл вместо печати на экране терминала. Соответственно, командная строка
заставляет программу abcd читать исходные данные из файла «tmp.dat» вместо ввода с клавиатуры. Командная строка
вводит значение целочисленной переменной n из входного потока. Строка
выводит значение переменой n в выходной поток. Строка
По умолчанию, стандартный выходной поток и выходной поток для печати ошибок назначены на экран терминала. Однако операция перенаправления вывода в файл > действует только на стандартный выходной поток. Например, в результате выполнения командной строки
обычный вывод программы abcd будет записываться в файл «tmp.res», а сообщения об ошибках по-прежнему будут печататься на экране терминала. Для того чтобы перенаправить в файл «tmp.log» стандартный поток печати ошибок, следует использовать командную строку
Таким образом, существование двух разных потоков вывода позволяет при необходимости отделить мух от котлет, т.е. направить нормальный вывод и вывод информации об ошибках в разные файлы.
Функции scanf и printf ввода и вывода в стандартные потоки
Документация
(Чтобы быть удаленным) Считанные данные из инструмента и отформатировать как текст
Синтаксис
A = fscanf(obj)
A = fscanf(obj,’ format ‘)
A = fscanf(obj,’ format ‘,size)
[A,count] = fscanf(. )
[A,count,msg] = fscanf(. )
[A,count,msg,datagramaddress] = fscanf(obj. )
[A,count,msg,datagramaddress,datagramport] = fscanf(obj. )
Аргументы
Спецификация преобразования языка C.
Количество значений, чтобы читать.
Данные считаны из инструмента и отформатированы как текст.
Количество чтения значений.
Сообщение, указывающее, была ли операция чтения неудачна.
Адрес дейтаграммного отправителя.
Порт дейтаграммного отправителя.
Описание
format спецификация преобразования языка C. Технические требования преобразования включают % символ и символы преобразования d, i, o, u, x, X, f, e, E, g, G, c, и s. Обратитесь к sscanf технические требования формата файлового ввода-вывода или руководство C для получения дополнительной информации.
Читайте в большей части n значения в вектор-столбец.
Читайте в большинстве значений m на n, заполняющих матрицу m на n в порядке следования столбцов.
[A,count,msg] = fscanf(. ) возвращает предупреждающее сообщение в msg если операция чтения не завершалась успешно.
[A,count,msg,datagramaddress] = fscanf(obj. ) возвращает дейтаграммный адрес в datagramaddress если obj объект UDP. Если больше чем одна дейтаграмма читается, datagramaddress ».
[A,count,msg,datagramaddress,datagramport] = fscanf(obj. ) возвращает дейтаграммный порт в datagramport если obj объект UDP. Если больше чем одна дейтаграмма читается, datagramport [].
Примеры
Создайте объект последовательного порта s на Windows ® машина и подключение s к Tektronix ® Осциллограф TDS 210, который отображает синусоиду.
Используйте fprintf функция, чтобы сконфигурировать осциллограф, чтобы измерить напряжение от пика к пику синусоиды, возвратите тип измерения и возвратите напряжение от пика к пику.
Используйте fscanf считать тип измерения. Операция завершится, когда первый терминатор строки будет считан.
Используйте fscanf считать напряжение от пика к пику как число с плавающей запятой и исключить терминатор строки.
Отключите s от осциллографа, и удаляют s из памяти и рабочей области.
Советы
Если msg не включен как выходной аргумент, и операция чтения не была успешна, затем предупреждающее сообщение возвращено в командную строку.
ValuesReceived значение свойства увеличено на количество чтения значений — включая терминатор строки — каждый раз fscanf выпущен.
Примечание
Чтобы получить список опций, можно использовать на функции, нажать клавишу Tab после ввода функции на MATLAB ® командная строка. Список расширяется, и можно прокрутить, чтобы выбрать свойство или значение. Для получения информации об использовании этой функции завершения вкладки «Дополнительно» смотрите Используя Заполнение клавишей Tab для Функций.
Правила для Завершения Операции чтения с fscanf
Операция чтения с fscanf блокирует доступ к командной строке MATLAB до
Для всех других интерфейсных объектов терминатор строки дан EOSCharCode свойство.
Время задано Timeout передачи свойства.
Дейтаграмма получена (для объектов UDP только, когда DatagramTerminateMode on ).
Входной буфер заполнен.
Линия EOI утверждается (только GPIB и инструменты VXI).
Больше о GPIB и Терминаторе VXI
Вопросы совместимости
serial интерфейс объекта будет удален
Не рекомендуемый запуск в R2019b
Использование этой функции с serial объект будет удален. Чтобы получить доступ к устройству последовательного порта, используйте a serialport объект с его функциями и свойствами вместо этого.
Смотрите Переход Ваш Код к Интерфейсу последовательного порта для получения дополнительной информации об использовании рекомендуемой функциональности.
Bluetooth интерфейс объекта будет удален
Не рекомендуемый запуск в R2020b
Использование этой функции с Bluetooth объект будет удален. Получить доступ к Bluetooth ® устройство, используйте a bluetooth объект с его функциями и свойствами вместо этого.
Смотрите Переход Ваш Код к Интерфейсу Bluetooth для получения дополнительной информации об использовании рекомендуемой функциональности.
tcpip интерфейс объекта будет удален
Не рекомендуемый запуск в R2020b
Использование этой функции с tcpip объект будет удален. Чтобы создать клиент TCP/IP или сервер, используйте a tcpclient или tcpserver объект с его функциями и свойствами вместо этого.
Смотрите Переход Ваш Код к Интерфейсу tcpclient или Перейдите Свой Код к Интерфейсу tcpserver для получения дополнительной информации об использовании рекомендуемой функциональности.
udp интерфейс объекта будет удален
Не рекомендуемый запуск в R2020b
Использование этой функции с udp объект будет удален. Чтобы получить доступ к сокету UDP, используйте a udpport объект с его функциями и свойствами вместо этого.
Смотрите Переход Ваш Код к Интерфейсу udpport для получения дополнительной информации об использовании рекомендуемой функциональности.
visa интерфейс объекта будет удален
Не рекомендуемый запуск в R2021a
Использование этой функции с visa объект будет удален. Чтобы получить доступ к ресурсу VISA, используйте a visadev объект с его функциями и свойствами вместо этого.
Смотрите Переход Ваш Код к Интерфейсу visadev для получения дополнительной информации об использовании рекомендуемой функциональности.
gpib интерфейс объекта будет удален
Не рекомендуемый запуск в R2021b
Использование этой функции с gpib объект будет удален. Чтобы получить доступ к инструменту GPIB, используйте интерфейс VISA-GPIB с a visadev объект, его функции и его свойства вместо этого.
Смотрите Переход Ваш Код к Интерфейсу VISA-GPIB для получения дополнительной информации об использовании рекомендуемой функциональности.