2012-06-06 11 views
5

Welchen Teil der C++ IO-Streams macht die \r zu \r\n Umwandlung? Ist es die stream_buf selbst oder ist es Teil der internen zu externen Kodierung Umwandlung von codecvt Facette?Streams, Stream_Bufs, Codecvt Facetten und n r n Übersetzung

UPDATE 1

Sie alle sagen, dass es in streambuf/filebuf erfolgt. OK. Aber wie behandelt diese Anordnung z. B. externe Codierungen wie UTF-16? Dann scheint es, dass die Datei mit ios::binary Flag geöffnet werden muss, die die Übersetzung deaktiviert.

+1

Sollte das nicht "\ n" zu "\ r \ n" Umwandlung sein? Normalerweise erhalten Sie von portablem Code ein '\ n' und Sie müssen den Zeilenvorschub für" windows like "Darstellungen voranstellen. –

+0

Um das zusätzliche '\ r' voranzustellen hat nichts mit der verwendeten Zeichencodierung zu tun, es ist immer noch ein extra Zeichen. Das "\ r" steuert einen Terminal-Schreibcursor, der bei einigen Terminals mit der Spalte 0 beginnt. 'codecvt' steuert, wie viele Bytes für die Codierung eines einzelnen Zeichens verwendet werden. –

Antwort

2

Diese Konvertierung wird (normalerweise) nicht von stream, streambuf oder facet ausgeführt. Es liegt in der Verantwortung des C-Bibliothekscodes (z. B. fputc()), der von Streambufs overflow() und underflow() aufgerufen wird.

Wenn Sie es aus irgendeinem Grund benötigen (zB wenn eine dos2unix Routine implementiert werden), gibt in boost.iostreams.

EDIT ein praktisches Beispiel ist: std::filebuf unterstützt nur multibyte Codierungen für Textdateien, zB UTF-8 oder GB18030 oder was auch immer die Gebietsschema verwendet. Eine UTF-16-Datei müsste im binären Modus als einfacher Byte-Stream geöffnet werden (was als UTF-16 mit C++ 11s Codecvt-Funktionen interpretiert werden kann), und ja, die Zeilenenden würden nicht konvertiert.

+0

streambuf-Implementierungen müssen nicht unbedingt fputc() verwenden, dies hängt vom Kontext ab. Wir haben Implementierungen für streambuf, die direkt zu einem UART zu Debugging-Zwecken ausgeben, das verwendete (RT) Betriebssystem bietet nicht einmal Dateihandles, also wie man fputc() dann verwendet ?? –

+0

@ g-makulik Der streambuf, der von 'std :: cout 'verwendet wird, muss den gleichen zugrunde liegenden Puffer verwenden wie das C I/O, wenn er in' stdout' schreibt, also wäre das kein Standard. Wie für Filebuf und andere Streambufs, naja, das ist, wofür mein "normalerweise" war. – Cubbi

1

IFAIR ist es in streambuf Implementierung getan, codecvt behandelt nur die Locale Darstellung Besonderheiten.

+0

Gleicher Kommentar zu Eric Malenfants Antwort: Warum ist das in FileBuf gemacht? Bedeutet das nicht, dass Filebuf Kenntnisse über die externe Kodierung der Codecvt-Facette haben muss? – wilx

+0

Es hat nichts mit Zeichenkodierung IMHO zu tun, aber wie das OS Zeilenenden in Terminalanzeigen behandelt. –

1

Er wird von std :: filebuf ausgeführt, wenn er ohne das ios :: binary-Flag geöffnet wurde.

+0

Warum ist es in 'Filebuf' getan? Bedeutet das nicht, dass 'filebuf' etwas über die externe Kodierung der' codecvt' Facette wissen muss? – wilx