Spec-Zone.ru › C++

std::vwscanf, std::vfwscanf, std::vswscanf

Определено в заголовке <cwchar>
int vwscanf( const wchar_t* format, std::va_list vlist );
(1) (с C++11)
int vfwscanf( std::FILE* stream, const wchar_t* format, std::va_list vlist );
(2) (с C++11)
int vswscanf( const wchar_t* buffer, const wchar_t* format, std::va_list vlist );
(3) (с C++11)

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

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

Параметры

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


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

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

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

Спецификатор
преобразования
Описание Тип аргумента
Модификатор длины → hh

(C++11)

h (нет) l ll

(C++11)

j

(C++11)

z

(C++11)

t

(C++11)

L
% Соответствует литералу %. Н/Д Н/Д Н/Д Н/Д Н/Д Н/Д Н/Д Н/Д Н/Д
c Соответствует символу или последовательности символов.

Если используется спецификатор ширины, соответствует ровно ширине широких символов (аргумент должен быть указателем на массив с достаточным объёмом). В отличие от %s и %[, не добавляет нулевой символ в массив.

Н/Д Н/Д
char*
wchar_t*
Н/Д Н/Д Н/Д Н/Д Н/Д
s Соответствует последовательности не-пробельных символов (строке).

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

[множество] Соответствует непустой последовательности символов из множества символов.

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

d Соответствует десятичному целому числу.

Формат числа такой же, как ожидается от wcstol со значением 10 для аргумента base

signed char* или unsigned char*
signed short* или unsigned short*
signed int* или unsigned int*
signed long* или unsigned long*
signed long long* или unsigned long long*
intmax_t* или uintmax_t*
size_t*
ptrdiff_t*
Н/Д
i Соответствует целому числу.

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

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

Формат числа такой же, как ожидается от wcstoul со значением 10 для аргумента base

o Соответствует неподписанному восьмеричному целому числу.

Формат числа такой же, как ожидается от wcstoul со значением 8 для аргумента base

x, X Соответствует неподписанному шестнадцатеричному целому числу.

Формат числа такой же, как ожидается от wcstoul со значением 16 для аргумента base

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

Ввод не потребляется. Счёт присваивания не увеличивается. Если для спецификатора определён оператор подавления присваивания, поведение неопределённо.

a, A(C++11)
e, E
f, F
g, G
Соответствует числу с плавающей точкой.

Формат числа такой же, как ожидается от wcstof

Н/Д Н/Д
float*
double*
Н/Д Н/Д Н/Д Н/Д
long double*
p Соответствует реализационно-определённой последовательности символов, определяющей указатель.

Семейство функций printf должно генерировать ту же последовательность с помощью спецификатора формата %p

Н/Д Н/Д
void**
Н/Д Н/Д Н/Д Н/Д Н/Д Н/Д

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

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

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

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

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

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

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

Значение возврата

Количество успешно прочитанных аргументов или EOF, если произошла ошибка.

Пример

См. также

wscanffwscanfswscanf
считывает форматированный ввод широких символов из stdin, потока файла или буфера
(функция)
Документация C для vwscanf, vfwscanf, vswscanf

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

Spec-Zone.ru

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