2012-06-06 16 views
5

¿Qué parte de las transmisiones de C++ IO realiza la conversión \r a \r\n? ¿Es el stream_buf mismo o es parte de la conversión de codificación interna a externa por codecvt faceta?streams, stream_bufs, codecvt facets y n to r n traducción

ACTUALIZA 1

Todos ustedes dicen que se hace en streambuf/filebuf. De acuerdo. Pero, ¿cómo se trata este arreglo, por ejemplo, codificaciones externas como UTF-16? Entonces parece que el archivo debe abrirse con el indicador ios::binary que deshabilita la traducción.

+1

¿No debería ser la conversión '\ n' a' \ r \ n'? Por lo general, lo que obtendrá de un código portátil es '\ n' y debe anteponer el salto de línea para las representaciones de" ventanas similares ". –

+0

Para anteponer el '\ r' adicional no tiene nada que ver con la codificación de caracteres utilizada, sigue siendo un personaje adicional. El '\ r' controla un cursor de escritura del terminal para comenzar en la columna 0 para algunos terminales. 'codecvt' controla cuántos bytes se usan para codificar un único carácter. –

Respuesta

2

Esta conversión no se realiza (normalmente) por transmisión, streambuf o faceta. Es responsabilidad del código de la biblioteca C (por ejemplo, fputc()) llamado por streambuf's overflow() y underflow().

Si lo necesita por alguna razón (por ejemplo, cuando se implementa una rutina dos2unix), hay un ejemplo práctico en boost.iostreams.

EDIT: std::filebuf sólo es compatible con las codificaciones multibyte para archivos de texto, por ejemplo, UTF-8 o GB18030 o cualquiera que sea el la localidad usa. Un archivo UTF-16 debería abrirse en modo binario, como una secuencia de bytes simples (que puede interpretarse como UTF-16 con las instalaciones de Codecvt de C++ 11), y sí, las terminaciones de línea no se convertirían.

+0

las implementaciones de streambuf no necesariamente necesitan usar fputc(), esto depende del contexto. Tenemos implementaciones para streambuf que dan salida directa a un UART para fines de depuración, el sistema operativo (RT) utilizado ni siquiera proporciona identificadores de archivos, entonces, ¿cómo usar fputc()? –

+0

@ g-makulik El streambuf utilizado por 'std :: cout' en particular es necesario para usar el mismo búfer subyacente que usa C I/O cuando escribe en' stdout', por lo que no sería estándar. En cuanto a Filebuf y otros streambufs, bueno, para eso era para lo que solía ser "normalmente". – Cubbi

1

IFAIR se hace en la implementación de streambuf, codecvt solo trata con los detalles de representación de locale.

+0

Mismo comentario en cuanto a la respuesta de Éric Malenfant: ¿Por qué se hace en filebuf? ¿Eso no significa que filebuf tiene que tener algún conocimiento de la codificación externa proporcionada por codecvt facet? – wilx

+0

No tiene nada que ver con la codificación de caracteres en mi humilde opinión, pero cómo el SO maneja los finales de línea en las pantallas de los terminales. –

1

Es realizado por std :: filebuf, si estaba abierto sin el indicador ios :: binary.

+0

¿Por qué se hace en 'filebuf'? ¿Eso no significa que 'filebuf' tiene que tener algún conocimiento de la codificación externa proporcionada por la faceta' codecvt'? – wilx

Cuestiones relacionadas