Spec-Zone.ru › C++

std::wscanf, std::fwscanf, std::swscanf

Определён в заголовочном файле <cwchar>
int wscanf( const wchar_t* format, ... );
(1)
int fwscanf( std::FILE* stream, const wchar_t* format, ... );
(2)
int swscanf( const wchar_t* buffer, const wchar_t* format, ... );
(3)

Считывает данные из различных источников, интерпретирует их согласно format и сохраняет результаты в заданных местах.

1) Считывает данные из stdin.
2) Считывает данные из файлового потока stream.
3) Считывает данные из завершающейся нулём широкострочной строки buffer.

Параметры

stream - входной файловый поток для чтения
buffer - указатель на завершающуюся нулём широкострочную строку для чтения
format - указатель на завершающуюся нулём широкострочную строку, задающую способ чтения входных данных
... - принимающие аргументы.


Строка format состоит из

  • не являющихся пробельными широких символов, кроме %: каждый такой символ в строке формата считывает из входного потока ровно один идентичный символ или приводит к сбою функции, если следующий символ в потоке не равен ему.
  • пробельных символов: любой одиночный пробельный символ в строке формата считывает из входных данных все доступные идущие подряд пробельные символы (определяется так, как если бы std::iswspace вызывалась в цикле). Обратите внимание, что между "\n", " ", "\t\t" и другими пробельными символами в строке формата нет различий.
  • спецификаторов преобразования. Каждый спецификатор преобразования имеет следующий формат:
    • вводный символ %.
    • (необязательно) символ подавления присваивания *. Если этот параметр указан, функция не присваивает результат преобразования ни одному принимающему аргументу.
    • (необязательно) целое число (больше нуля), задающее максимальную ширину поля, то есть максимальное количество символов, которое функция может считать при выполнении преобразования, заданного текущим спецификатором преобразования. Обратите внимание, что %s и %[ могут привести к переполнению буфера, если ширина не указана.
    • (необязательно) модификатор длины, задающий размер принимающего аргумента, то есть фактический тип назначения. Он влияет на точность преобразования и правила переполнения. Тип назначения по умолчанию различается для каждого типа преобразования (см. таблицу ниже).
    • спецификатор формата преобразования.

Доступны следующие спецификаторы формата:

Спецификатор
преобразования
Описание Ожидаемый
тип аргумента
Модификатор длины→ hh h нет l ll j z t L
Доступно только начиная с C++11→ Да Да Да Да Да
% Совпадает с литеральным символом %. Н/П Н/П Н/П Н/П Н/П Н/П Н/П Н/П Н/П
c

Совпадает с символом или последовательностью символов.

  • Если используется спецификатор ширины, совпадение происходит ровно с width широкими символами (аргумент должен быть указателем на массив достаточного размера).
  • В отличие от %s и %[, не добавляет в массив символ null.
Н/П Н/П
char*
wchar_t*
Н/П Н/П Н/П Н/П Н/П
s

Совпадает с последовательностью непробельных символов (строкой).

  • Если используется спецификатор ширины, совпадает не более чем с width символами или до первого пробельного символа — в зависимости от того, что встретится раньше.
  • Всегда сохраняет символ null после совпавших символов (поэтому в массиве аргумента должно быть место как минимум для width+1 символов).
[set ]

Совпадает с непустой последовательностью символов из набора символов set.

  • Если первый символ набора — ^, совпадают все символы, не входящие в набор.
  • Если набор начинается с ] или ^], символ ] также включается в набор.
  • Определяется реализацией, может ли символ - в позиции, отличной от начальной, в сканируемом наборе обозначать диапазон, как в [0-9].
  • Если используется спецификатор ширины, совпадает не более чем с width символами.
  • Всегда сохраняет символ null после совпавших символов (поэтому в массиве аргумента должно быть место как минимум для width+1 символов).
d

Совпадает с десятичным целым числом.

  • Формат числа такой же, как ожидаемый std::wcstol при значении 10 для аргумента base.
signedchar* or unsignedchar*
signedshort* or unsignedshort*
signedint* or unsignedint*
signedlong* or unsignedlong*
signedlonglong* or unsignedlonglong*
std::intmax_t* or std::uintmax_t*
std::size_t*
std::ptrdiff_t*
Н/П
b (C++26)

Совпадает с беззнаковым двоичным целым числом.

  • Формат числа такой же, как ожидаемый std::wcstoul при значении 2 для аргумента base.
i

Совпадает с целым числом.

  • Формат числа такой же, как ожидаемый std::wcstol при значении 0 для аргумента base (основание определяется по первым разобранным символам).
u

Совпадает с беззнаковым десятичным целым числом.

  • Формат числа такой же, как ожидаемый std::wcstoul при значении 10 для аргумента base.
o

Совпадает с беззнаковым восьмеричным целым числом.

  • Формат числа такой же, как ожидаемый std::wcstoul при значении 8 для аргумента base.
x
X

Совпадает с беззнаковым шестнадцатеричным целым числом.

  • Формат числа такой же, как ожидаемый std::wcstoul при значении 16 для аргумента base.
n

Возвращает количество прочитанных на данный момент символов.

  • Входные данные не считываются. Счётчик присваиваний не увеличивается.
  • Если для спецификатора задан оператор подавления присваивания, поведение не определено.
a (C++11)
A (C++11)
e
E
f
F (C++11)
g
G

Совпадает с числом с плавающей точкой.

  • Формат числа такой же, как ожидаемый std::wcstof.
Н/П Н/П
float*
double*
Н/П Н/П Н/П Н/П
longdouble*
p

Совпадает с определяемой реализацией последовательностью символов, представляющей указатель.

  • Семейство функций printf должно выдавать ту же последовательность при использовании спецификатора формата %p.
Н/П Н/П
void**
Н/П Н/П Н/П Н/П Н/П Н/П
Примечания

Для каждого спецификатора преобразования, кроме n, из потока считывается самая длинная последовательность входных символов, которая не превышает заданную ширину поля и либо точно соответствует тому, что ожидает спецификатор преобразования, либо является префиксом ожидаемой последовательности. Первый символ после этой последовательности, если он есть, остаётся непрочитанным. Если длина считанной последовательности равна нулю или её невозможно преобразовать, как описано выше, происходит ошибка сопоставления, за исключением случаев, когда ввод из потока был невозможен из-за конца файла, ошибки кодирования или ошибки чтения: тогда происходит ошибка ввода.

За исключением спецификатора %, элемент ввода (или, для %n, количество входных символов) сначала преобразуется в тип, соответствующий спецификатору преобразования. Если присваивание не подавлено с помощью *, результат преобразования записывается в объект, на который указывает следующий ещё не использованный аргумент. Если этот объект имеет неподходящий тип или результат преобразования не может быть представлен в объекте, поведение не определено.

Все спецификаторы преобразования, кроме [, c и n, перед разбором входных данных считывают и отбрасывают все начальные пробельные символы (определяется так, как если бы вызывалась std::iswspace). Эти считанные символы не учитываются в заданной максимальной ширине поля.

Если модификатор длины l не используется, спецификаторы преобразования c, s и [ выполняют преобразование широких символов в многобайтовые так, как если бы вызывалась std::wcrtomb с объектом std::mbstate_t, инициализированным нулём перед преобразованием первого символа.

Спецификаторы преобразования s и [ всегда сохраняют завершающий символ null после совпавших символов. Размер целевого массива должен быть как минимум на единицу больше заданной ширины поля. Использование %s или %[ без указания размера целевого массива так же небезопасно, как std::gets.

Правильные спецификаторы преобразования для целочисленных типов фиксированной ширины (std::int8_t и т. д.) определены в заголовочном файле <cinttypes> (хотя SCNdMAX, SCNuMAX и т. д. являются синонимами %jd, %ju и т. д.).

После выполнения каждого спецификатора преобразования имеется точка последовательности; это позволяет сохранять несколько полей в одной и той же переменной-приёмнике.

При разборе неполного значения с плавающей точкой, заканчивающегося экспонентой без цифр, например при разборе "100er" со спецификатором преобразования %f, считывается последовательность "100e" (самый длинный префикс потенциально корректного числа с плавающей точкой), что приводит к ошибке сопоставления (считанную последовательность нельзя преобразовать в число с плавающей точкой), а "r" остаётся непрочитанным. Некоторые существующие реализации не следуют этому правилу и откатываются, считывая только "100" и оставляя "er", например ошибка glibc 1765.

Если спецификация преобразования недопустима, поведение не определено.

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

Количество успешно прочитанных аргументов или EOF, если сбой произошёл до присваивания значения первому принимающему аргументу.

Пример

См. также

vwscanfvfwscanfvswscanf
(C++11)(C++11)(C++11)
считывают форматированный ввод широких символов из stdin, файлового потока
или буфера с использованием списка аргументов переменной длины
(функция)
Документация по C для wscanf, fwscanf, swscanf

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/io/c/fwscanf

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API