2010-03-11 34 views
5

Tengo el siguiente fragmento de código en C++.No se puede escribir un archivo binario

int arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; 
ofstream output("Sample.txt", ios::out | ios::binary); 

for(int i = 0; i < 10; i++) 
{ 
    output<<arr[i]; 
} 

Ahora el ejemplo.txt es así:

12345678910 

no es el "ejemplo.txt" supone que es en binario? ¿Por qué no convierte todo en binario cuando abrí la secuencia en modo binario? Qué debo hacer, en caso de que necesite un binario de cada elemento de la matriz y luego imprimirlo en el archivo.

+0

¿Qué quiere decir con "en binario"? – GManNickG

+0

valores binarios para los enteros correspondientes en la matriz, por lo que si el entero en la matriz es 5, debe imprimir 101 en lugar de 5 – Jay

+0

Bueno, debe usar la función 'write' para dar salida a los datos sin procesar. Pero con eso, * imprime * 101 (bueno, probablemente más como 0000000000000101) en el disco, pero lo que sea que esté usando para ver el archivo no mostrará realmente los de cero y uno en bruto. Los lectores de archivos de texto intentarán decodificarlo (con ASCII, por ejemplo), y es por eso que cuando abre archivos binarios en un editor de texto, ve basura confusa. Nunca se ve 1 y 0. Quizás un editor hexadecimal, que sí lo haga, sería más adecuado. – GManNickG

Respuesta

3

¿No se supone que el "Sample.txt" está en binario?

No. Lo que hace es std::ios::binary para evitar cosas como la traducción de '\n' desde/hasta el EOL específico de la plataforma. No omitirá la traducción entre la representación interna de los bytes de datos y su traducción de cadenas. Después de todo, de eso se tratan las transmisiones. (Además, piense en cómo transmitiría un objeto de un tipo definido por el usuario que contiene punteros en una representación binaria.)

Para escribir realmente objetos de uso binario std::ostream::write(). Tenga cuidado, sin embargo, el resultado es específico de la plataforma.

+0

Entonces, ¿cómo escribo la matriz como valores binarios en un archivo? – Jay

+0

output.write ((char *) arr, sizeof (arr)); –

+0

si digo, output.write ((char *) arr [i], sizeof (int)); el programa se colgó y output.write ((char *) arr, sizeof (arr)) no imprime nada en el archivo Sample.txt – Jay

0

El modo binario significa principalmente que (por ejemplo) no habrá una transformación entre un carácter de nueva línea que programa escribe, y lo que su plataforma crea que marca el final de una línea (por ejemplo, "\ r \ n" en Windows, "\ r" en el Ma).

Para escribir en realidad binario, normalmente usaría ofstream.write().

0

Binario solo significa que los caracteres de nueva línea no se convierten a/desde el formato específico del sistema operativo. La salida de un valor de tipo int con ofstream lo formateará como número decimal (texto ASCII normal).

Por lo que entendemos por binaria, debe más bien escribir valores de tipo char o utilizar la función de formateo no output.write (docs here).

0

Binario como en 'no texto' significa que no se formatea como líneas nuevas y así sucesivamente.

See:

Los flujos de archivos abiertos en modo binario realizan operaciones de entrada y salida independientemente de cualquier formato consideraciones. Los archivos no binarios son conocidos como archivos de texto, y algunas traducciones pueden ocurrir debido al formato de algunos caracteres especiales (como caracteres de nueva línea y retorno de carro).

No se traducirá para usted a 0 y 1 formato. Todo en la PC usa el formato binary, pero cuando abre el archivo y lo lee con el editor, el editor lee los datos binarios y muestra los caracteres ASCII por usted.

Cuestiones relacionadas