Spec-Zone.ru › C++

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

Определено в заголовке <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"; // or u8"zß水𝄋"
                     // or "\x7a\xc3\x9f\xe6\xb0\xb4\xf0\x9d\x84\x8b"
 
    // note that the following can be done with wstring_convert
    std::mbstate_t mb = std::mbstate_t(); // initial shift state
    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);
    // error checking skipped for brevity
    internal.resize(to_next - &internal[0]);
 
    std::wcout << L"The string in wide encoding: " << internal << '\n';
}

Вывод:

The string in wide encoding: zß水𝄋

Отчеты об ошибках

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

DR Применяется к Поведение, опубликованное Корректное поведение
LWG 76 C++98 было неясно, требуется ли преобразованию
поддержка выдачи одного внутреннего символа за раз
требуется только если используется
basic_filebuf

См. также

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

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/locale/codecvt/in

Spec-Zone.ru

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