2012-06-06 9 views
5

Quale parte dei flussi di C++ IO esegue la conversione da \r a \r\n? È lo stream_buf stesso o fa parte della conversione di codifica interna a esterna da codecvt facet?flussi, stream_bufs, faccette codecvt e n per r n traduzione

UPDATE 1

Voi tutti dicono che si è fatto in streambuf/filebuf. Ok. Ma come si comporta questa disposizione, ad es. Codifiche esterne come UTF-16? Quindi sembra che il file debba essere aperto con il flag ios::binary che disabilita la traduzione.

+1

Non dovrebbe essere '\ n' a' \ r \ n' conversione? Di solito ciò che otterrai dal codice portatile è un '\ n' e devi anteporre il feed di riga alle rappresentazioni di" finestre simili ". –

+0

Per anteporre l'extra '\ r' non ha nulla a che fare con la codifica dei caratteri usati, è pur sempre un personaggio extra. '\ R' controlla un cursore di scrittura del terminale per iniziare dalla colonna 0 per alcuni terminali. 'codecvt' controlla quanti byte sono usati per codificare un singolo carattere. –

risposta

2

Questa conversione non viene (di solito) eseguita da stream, streambuf o facet. È responsabilità del codice di libreria C (ad esempio fputc()) chiamato da streambuf overflow() e underflow().

Se ne avete bisogno per qualche motivo (ad esempio, in sede di attuazione di una routine dos2unix), c'è un esempio a portata di mano in boost.iostreams.

EDIT: std::filebuf supporta solo codifiche multibyte per i file di testo, ad esempio UTF-8 o GB18030 o qualunque sia il usi locali. Un file UTF-16 dovrebbe essere aperto in modalità binaria, come un flusso di byte semplici (che può essere interpretato come UTF-16 con i servizi di codecvt di C++ 11), e sì, le terminazioni di riga non vengono convertite.

+0

le implementazioni di streambuf non devono necessariamente usare fputc(), questo dipende dal contesto. Abbiamo implementazioni per streambuf che vengono inviate direttamente a un UART per scopi di debug, il sistema operativo (RT) utilizzato non fornisce nemmeno handle di file, quindi come usare fputc() allora ?? –

+0

@ g-makulik In particolare, lo streambuf utilizzato da 'std :: cout' è necessario per utilizzare lo stesso buffer sottostante di quello che l'I/O utilizza durante la scrittura su' stdout', quindi questo non sarebbe standard. Per quanto riguarda filebuf e altri streambuf, beh, questo è quello che il mio "solito" era per. – Cubbi

1

IFAIR è in esecuzione streambuf, codecvt tratta solo le specifiche di localizzazione.

+0

Stesso commento della risposta di Éric Malenfant: Perché è fatto in filebuf? Ciò non significa che filebuf deve avere una certa conoscenza della codifica esterna fornita da facet codecvt? – wilx

+0

Non ha nulla a che fare con la codifica dei caratteri IMHO, ma come il sistema operativo gestisce le terminazioni di linea nei display dei terminali. –

1

Viene eseguito da std :: filebuf, se era aperto senza il flag ios :: binary.

+0

Perché è fatto in 'filebuf'? Ciò non significa che 'filebuf' deve avere una certa conoscenza della codifica esterna fornita dal facet' codecvt'? – wilx