Namespaces
Variants

std::codecvt<InternT,ExternT,StateT>:: in, std::codecvt<InternT,ExternT,StateT>:: do_in

From cppreference.net
Определено в заголовке <locale>
public :

result in ( StateT & state,
const ExternT * from,
const ExternT * from_end,
const ExternT * & from_next,
InternT * to,
InternT * to_end,

InternT * & to_next ) const ;
(1)
protected :

virtual result do_in ( StateT & state,
const ExternT * from,
const ExternT * from_end,
const ExternT * & from_next,
InternT * to,
InternT * to_end,

InternT * & to_next ) const ;
(2)
1) Открытая функция-член, вызывает функцию-член do_in самого производного класса.
2) Если данный фасет codecvt определяет преобразование, переводит внешние символы из исходного диапазона [ from , from_end ) во внутренние символы, размещая результаты в последующих позициях, начиная с to . Преобразует не более чем from_end - from внешних символов и записывает не более чем to_end - to внутренних символов. Оставляет from_next и to_next указывающими на элемент, следующий за последним успешно преобразованным.

Если этот codecvt фасет не определяет преобразование, символы не преобразуются. to_next устанавливается равным to , state остаётся неизменным, и возвращается std::codecvt_base::noconv .

do_in ( state, from, from_end, from_next, to, to + 1 , to_next ) должен возвращать ok если

  • Этот codecvt фасет используется basic_filebuf , и
  • do_in ( state, from, from_end, from_next, to, to_end, to_next ) возвращает ok когда to ! = to_end .

Содержание

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

Значение типа std::codecvt_base::result , указывающее статус выполнения следующим образом:

ok преобразование завершено
partial недостаточно места в выходном буфере или неожиданный конец исходного буфера
error встречен символ, который не может быть преобразован
noconv данный фасет не выполняет преобразование, вывод не записывается

Непреобразующая специализация std:: codecvt < char , char , std:: mbstate_t > всегда возвращает std::codecvt_base::noconv .

Примечания

Требует, чтобы from <= from_end && to <= to_end и чтобы state либо представлял начальное состояние сдвига, либо был получен преобразованием предыдущих символов в последовательности.

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

Пример

#include <iostream>
#include <locale>
#include <string>
int main()
{
    std::locale::global(std::locale("en_US.utf8"));
    auto const& f = std::use_facet<std::codecvt<wchar_t, char, std::mbstate_t>>
        (std::locale());
    std::string external = "z\u00df\u6c34\U0001d10b"; // или u8"zß水𝄋"
                     // или "\x7a\xc3\x9f\xe6\xb0\xb4\xf0\x9d\x84\x8b"
    // примечание: следующее может быть выполнено с помощью wstring_convert
    std::mbstate_t mb = std::mbstate_t(); // начальное состояние сдвига
    std::wstring internal(external.size(), '\0'); 
    const char* from_next;
    wchar_t* to_next;
    f.in(mb, &external[0], &external[external.size()], from_next,
             &internal[0], &internal[internal.size()], to_next);
    // проверка ошибок пропущена для краткости
    internal.resize(to_next - &internal[0]);
    std::wcout << L"The string in wide encoding: " << internal << '\n';
}

Вывод:

The string in wide encoding: zß水𝄋

Отчеты о дефектах

Следующие отчеты об изменениях поведения, влияющие на дефекты, были применены ретроактивно к ранее опубликованным стандартам C++.

DR Applied to Behavior as published Correct behavior
LWG 76 C++98 было неясно, требуется ли преобразование
для поддержки генерации одного внутреннего символа за раз
требуется только при использовании
в basic_filebuf

Смотрите также

[virtual]
читает из связанного файла
(виртуальная защищенная функция-член std::basic_filebuf<CharT,Traits> )
преобразует байтовую строку в широкую строку
(публичная функция-член std::wstring_convert<Codecvt,Elem,Wide_alloc,Byte_alloc> )
преобразует узкую многобайтовую строку символов в широкую строку с учетом состояния
(функция)
[virtual]
преобразует строку из InternT в ExternT , например, при записи в файл
(виртуальная защищенная функция-член)