2011-09-18 28 views
7

¿Cuál es la diferencia entre estos dos? ¿No es redundante el objeto del indicador in? Gracias.¿Se necesita ios :: en ifstream's abierto en modo binario?

std::ifstream file1("one.bin", std::ifstream::in | std::ifstream::binary);

std::ifstream file2("two.bin", std::ifstream::binary);

+2

erm ... de los documentos Supongo que no es redundante; y vale 30 segundos para ... intentar :) – sehe

+0

¿Por qué es relevante si es binario o no? – Dani

Respuesta

5

A partir de los documentos sobre el constructor ifstream clase:

binaria (binario) Considere corriente como binario en lugar de texto.
en (entrada) Permiten operaciones de entrada en la transmisión.

Así que cuando la lectura de un archivo, usaría std::ifstream::in bandera no porque se requiere (o no), sino porque sería una buena práctica de programación para permitir una interfaz de programación de saber lo que va a utilizarlo.

Editar:
se toma a partir de la siguiente http://www.cplusplus.com/doc/tutorial/files/, sobre open() función miembro, aunque (pero los constructores en el código en la pregunta probablemente llaman open() copiar los parámetros de modo sin modificaciones).

clase: parámetro de modo predeterminado
ofstream: ios :: out
ifstream: ios :: en
fstream: en ios :: | ios :: Fuera

Para las clases ifstream y ofstream, ios :: en y ios :: out son de forma automática y, respectivamente, supone, incluso si un modo que no lo hace incluyen ellos se pasa como segundo argumento al open() función del miembro .

Sin embargo, muchos ejemplos más de la Web usan ifstream::in cuando muestra una construcción de un objeto ifstream. Podría ser realmente una especie de práctica de superstición, en lugar de una de programación.

+1

@ Naveen: ¿Debo dejar que 'ifstream' sepa que quiero usarlo para _input_? De la misma manera, podría usar '' flujo simple '' - por eso publiqué esta pregunta en primer lugar. :) –

+0

Sí, buen punto: P Ya me he vuelto más suave en la edición. –

+1

Chicos, dejen de votar mi respuesta porque realmente no da mucha respuesta, solo expresa una opinión personal y además da información indirectamente relacionada sobre la función de miembro 'open()'. Sin embargo, no significa que quiera que se vote downvoted =) –

1

No puedo encontrar documentación autorizada en línea.

Editar Ni siquiera puedo encontrar una referencia adecuada en mi copia el Josuttis Book, octava impresión. Debería haber sido en la sección 13.9 pp 627-631

La evidencia empírica sugiere que es redundante IFF ninguno de std :: ios :: o en std :: ios:. Cabo son pasados:

#include <fstream> 
#include <iostream> 

int main(int argc, char** args) 
{ 
    std::ifstream ifs(args[0], std::ios::binary); 
    std::cout << ifs.rdbuf() << std::flush; 

    return 0; 
} 

tiene éxito:

test | md5sum 
md5sum test 

muestran la misma suma de hash. (Salida de cero bytes)


// ... 
    std::ifstream ifs(args[0], std::ios::out | std::ios::binary); 

fallará

test | wc -c # shows 0 
1

binary, en este caso, solo se refiere al método de lectura o escritura. En modo regular en Windows, '\n' se traduce a '\r''\n'. Esto puede afectar tanto la lectura como la escritura, por lo que el modo binario lo desactiva. out|binary tiene tanto sentido como in|binary

Cuestiones relacionadas