2009-08-14 11 views
10

ho sempre letto e stato detto che quando si tratta di file binari che si dovrebbe usare read() e write() in contrapposizione ai < <e> > operatori come essi sono destinati per l'uso con dati formattati. Ho anche letto che è possibile usarli, ma è un argomento avanzato, che non riesco a trovare dove qualcuno si tuffa e discute.C++ fstream << and >> operatori con i dati binari

recente ho visto un po 'di codice che ha fatto la seguente:

 
std::ifstream file1("x", ios_base::in | ios_base::binary); 
std::ofstream file2("y", ios_base::app | ios_base::binary); 

file1 << file2.rdbuf(); 

Quando ho fatto notare l'uso del < < dell'operatore con il file binario, mi hanno detto che la chiamata rdbuf() restituisce uno streambuf * e che < < sovraccarichi lo streambuf * e faccia una copia diretta senza formattazione ed è quindi sicuro.

È vero e anche sicuro? Che ne dici dell'efficienza? Qualche trucco? I dettagli sarebbero molto apprezzati.

Grazie!

risposta

4

Sì (vedere 27.6.2.5.3/6 in cui è descritto il sovraccarico di < < per streambuf).

+3

È una pagina nello standard o cosa? :) Un link sarebbe bello! – Skurmedel

+0

Questo è un riferimento a un paragrafo nello standard. Lo standard stesso non è disponibile al pubblico. Alcune bozze sono ma non ho un collegamento facilmente. – AProgrammer

+0

Ok, grazie per aver chiarito. Dovrebbero rendere pubblico lo standard. – Skurmedel

3

È completamente sicuro e un modo ragionevole per copiare flussi.

Nota che permette anche cose come:

std::ifstream file_in1("x1", ios_base::in | ios_base::binary); 
std::ifstream file_in2("x2", ios_base::in | ios_base::binary); 
std::ofstream file_out("y", ios_base::app | ios_base::binary); 

file_out << file_in1.rdbuf() << "\nand\n" << file_in2.rdbuf(); 
+0

È molto carino. – Skurmedel

+0

Avete dettagli sul motivo per cui questo è sicuro? So che puoi farlo e sembra funzionare, ma la mia curiosità sta nel fatto che è una cosa comune vedere dove i riferimenti affermano che << and >> non sono per dati binari. Ad esempio questo funziona per i file di testo che vengono aperti come binari e per le immagini uguali? –

+0

<< and >> sono operatori in sovraccarico. Vale a dire, ci sono molte implementazioni. In generale, questi sono destinati al testo e formatteranno il loro secondo operando. Tuttavia, il sovraccarico di streambuf è fondamentalmente diverso da tutti gli altri. – MSalters

1

Nel § 27.7.3.6.3 dello standard C++, è detto che
basic_ostream<charT,traits>& operator<< (basic_streambuf<charT,traits>* sb);
Effects: Behaves as an unformatted output function (as described in 27.7.3.7, paragraph 1).

§ 27.7.3.7 descrive "input non formattato", che è fondamentalmente una copia binaria. Ciò significa che le funzioni ostream "non formattate" sono sicure per i dati binari. Le altre funzioni "non formattate" menzionate nello standard che posso trovare sono put, write e (ufficialmente) flush.

Problemi correlati