2009-08-14 8 views
10

He Siempre lea y les ha dicho que cuando se trata de archivos binarios que se debe usar read() y write() en lugar de los < <y> > operadores, ya que están destinados para usar con datos formateados. También he leído que es posible usarlos, pero es un tema avanzado, que no puedo encontrar en el que alguien se sumerge y discute.C++ fstream << and >> operadores con datos binarios

Hace poco vi un poco de código que hizo lo siguiente:

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

file1 << file2.rdbuf(); 

Cuando señalé el uso de la < < operador con el archivo binario, me dijeron que el rdbuf() llamada devuelve un streambuf * y que < < sobrecarga el streambuf * y hace una copia directa sin formato y por lo tanto es seguro.

¿Es esto verdad y también seguro? ¿Qué tal la eficiencia? ¿Algún problema? Los detalles serían muy apreciados.

Gracias!

Respuesta

4

Sí (consulte 27.6.2.5.3/6 donde se describe la sobrecarga de < < para streambuf).

+3

¿Es eso una página en el estándar o qué? :) ¡Un enlace estaría bien! – Skurmedel

+0

Esta es una referencia a un párrafo en el estándar. El estándar en sí no está disponible públicamente. Algunos borradores son pero no tengo un enlace de manera práctica. – AProgrammer

+0

Bien, gracias por aclarar. Deberían hacer público el estándar. – Skurmedel

3

Es completamente seguro y una forma razonable de copiar secuencias.

Tenga en cuenta que también permite cosas como:

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

Eso es bastante limpio. – Skurmedel

+0

¿Tiene detalles de por qué esto es seguro? Sé que puedes hacer esto y parece funcionar, pero mi curiosidad radica en el hecho de que es común ver que las referencias indican que << and >> no son para datos binarios. Por ejemplo, ¿esto funciona para archivos de texto que se abren como binarios y para imágenes de la misma manera? –

+0

<< and >> son operadores sobrecargados. Es decir, hay muchas implementaciones. En general, están diseñados para texto y formatearán su segundo operando. Sin embargo, la sobrecarga streambuf es fundamentalmente diferente de todas las demás. – MSalters

1

En § 27.7.3.6.3 del estándar C++, se menciona que
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 describe "entrada sin formato", que es básicamente una copia binaria. Esto significa que las funciones ostream "sin formato" son seguras para los datos binarios. Las otras funciones "no formateadas" mencionadas en el estándar que puedo encontrar son put, write y (oficialmente) flush.

Cuestiones relacionadas