Namensräume
Varianten
Aktionen

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

Von cppreference.com
< cpp‎ | locale‎ | codecvt
 
 
 
 
 
Definiert in Header <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) Öffentliche Member-Funktion, ruft die Member-Funktion do_in der am weitesten abgeleiteten Klasse auf.
2) Wenn dieses codecvt-Facet eine Konvertierung definiert, werden die externen Zeichen aus dem Quellbereich [fromfrom_end) in interne Zeichen umgewandelt und die Ergebnisse an den nachfolgenden Speicherstellen beginnend bei to platziert. Es werden nicht mehr als from_end - from externe Zeichen konvertiert und nicht mehr als to_end - to interne Zeichen geschrieben. from_next und to_next zeigen auf das Element, das auf das letzte erfolgreich konvertierte Element folgt.

Wenn dieses codecvt-Facet keine Konvertierung definiert, werden keine Zeichen konvertiert. to_next wird gleich to gesetzt, state bleibt unverändert und std::codecvt_base::noconv wird zurückgegeben.

do_in(state, from, from_end, from_next, to, to + 1, to_next) muss ok zurückgeben, wenn

  • dieses codecvt-Facet von basic_filebuf verwendet wird, und
  • do_in(state, from, from_end, from_next, to, to_end, to_next) ok zurückgeben würde, wobei to != to_end gilt.

Inhalt

[bearbeiten] Rückgabewert

Ein Wert vom Typ std::codecvt_base::result, der den folgenden Erfolgstatus angibt:

ok Konvertierung abgeschlossen
partiell nicht genügend Speicher im Ausgabepuffer oder unerwartetes Ende des Quellpuffers
error auf ein Zeichen gestoßen, das nicht konvertiert werden konnte
noconv dieses Facet ist nicht-konvertierend, keine Ausgabe geschrieben

Die nicht-konvertierende Spezialisierung std::codecvt<char, char, std::mbstate_t> gibt immer std::codecvt_base::noconv zurück.

[bearbeiten] Hinweise

Voraussetzung ist, dass from <= from_end && to <= to_end gilt und dass state entweder den anfänglichen Shift-Zustand repräsentiert oder durch Konvertierung der vorhergehenden Zeichen in der Sequenz erhalten wurde.

Die Auswirkung auf state ist absichtlich nicht spezifiziert. In Standard-Facets wird sie zur Beibehaltung des Shift-Zustands verwendet, wie beim Aufruf von std::mbsrtowcs, und wird daher aktualisiert, um den Konvertierungszustand nach dem letzten verarbeiteten externen Zeichen widerzuspiegeln. Ein benutzerdefiniertes Facet kann es jedoch frei verwenden, um jeden anderen Zustand beizubehalten, z. B. die Anzahl der Sonderzeichen zu zählen.

[bearbeiten] Beispiel

#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';
}

Ausgabe

The string in wide encoding: zß水𝄋

[bearbeiten] Fehlerberichte

Die folgenden Verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.

DR angewendet auf Verhalten wie veröffentlicht Korrigiertes Verhalten
LWG 76 C++98 war unklar, ob die Konvertierung erforderlich ist, um
die Produktion eines internen Zeichens nach dem anderen zu unterstützen
nur erforderlich, wenn verwendet
von basic_filebuf

[bearbeiten] Siehe auch

[virtuell]
liest aus der zugeordneten Datei
(virtuelle protected Memberfunktion von std::basic_filebuf<CharT,Traits>) [bearbeiten]
konvertiert einen Byte-String in einen Wide-String
(öffentliche Member-Funktion von std::wstring_convert<Codecvt,Elem,Wide_alloc,Byte_alloc>) [bearbeiten]
konvertiert einen schmalen Multibyte-Zeichenstring in einen Wide-String, gegeben den Zustand
(Funktion) [bearbeiten]
[virtuell]
konvertiert eine Zeichenkette von InternT nach ExternT, z. B. beim Schreiben in eine Datei
(virtual protected member function) [bearbeiten]