2008-10-23 22 views
45

¿Qué traducción se produce al escribir en un archivo que se abrió en modo texto que no se produce en modo binario? Específicamente en MS Visual C.Diferencia entre archivos escritos en modo binario y texto

unsigned char buffer[256]; 
for (int i = 0; i < 256; i++) buffer[i]=i; 
int size = 1; 
int count = 256; 

modo binario:

FILE *fp_binary = fopen(filename, "wb"); 
fwrite(buffer, size, count, fp_binary); 

Versus modo de texto:

FILE *fp_text = fopen(filename, "wt"); 
fwrite(buffer, size, count, fp_text); 
+0

la motivación para la cuestión era que quería recuperar datos binarios que, por error, escribe en el disco en modo texto – jholl

+0

en estrecha relación:.. http://stackoverflow.com/q/ . 11981434/183120 – legends2k

Respuesta

35

Creo que la mayoría de las plataformas ignorarán la opción "t" o la opción "modo de texto" cuando se trate de transmisiones. En Windows, sin embargo, este no es el caso. Si se echa un vistazo a la descripción de la función fopen() en: MSDN, se verá que especificar la opción "t" tendrá el siguiente efecto:

  • saltos de línea ('\ n') será traducido a '\ r \ n" secuencias sobre la producción
  • retorno de carro/secuencias de avance de línea serán traducidas a la línea alimenta de entrada.
  • Si el archivo se abre en modo append, el final del archivo será examinada para un carácter ctrl-z (carácter 26) y ese carácter eliminado, si es posible. También interpretará la presencia de ese personaje como el final del archivo. Este es un desafortunado vestigio de los días del CPM (algo acerca de los pecados del padres b visitas a sus hijos hasta la tercera o cuarta generación). Contrariamente a la opinión establecida anteriormente, el carácter ctrl-z no se agregará.
+12

el retorno de carro es en realidad '\ r', '\ n' es el avance de línea. –

+0

¿Tiene este comportamiento para todo tipo de operaciones de archivos? P.ej. fread y fwrite (que se utilizan principalmente con archivos binarios)? – Calmarius

+0

La traducción se especifica cuando se abre el identificador de archivo y se lleva a cabo en un nivel bajo. Se llevará a cabo independientemente de las funciones que use para leer (o escribir) el archivo. –

26

En el modo de texto, un salto de línea "\ n" puede convertirse en un carro return + newline "\ r \ n"

Por lo general, querrá abrir en modo binario. Intentar leer cualquier dato binario en modo texto no funcionará, se dañará. Aunque puede leer texto en modo binario, simplemente no hará traducciones automáticas de "\ n" a "\ r \ n".

Ver fopen

+2

para la lectura, la traducción de obras lo contrario de lo que usted describe - la conversión "\ r \ n" a "\ n" –

+2

que Es sólo para Windows –

+1

techtonik: Todas las plataformas le permitirá especificar el modo de texto? , pero en Unix/Linux no es diferente al modo binario. Solo en Windows hace la diferencia. (Y posiblemente algunas plataformas más oscuros - que tendría que comprobar su documentación de la plataforma para estar seguro de que hay) – MrZebra

5

Además, cuando se FOPEN un archivo con "ta" la entrada es terminada en un carácter Ctrl-Z.

+2

Verdadero - hago mis propios formatos de archivos comienza con algo como "mi-archivo de tipo^Z" , entonces, si lo "escribe"/"cat" desde la línea de comando, simplemente le da los "números mágicos" del archivo y se detiene en lugar de arrojar binarios a su terminal. – MrZebra

2

Hemos tenido un problema interesante con la apertura de archivos en modo texto en el que los archivos tenían una mezcla de caracteres de línea de fin:

1\n\r 
2\n\r 
3\n 
4\n\r 
5\n\r 

Nuestro requisito es que podemos guardar nuestra posición actual en el archivo (que se usa fgetpos), cierre el archivo y luego vuelva a abrir el archivo y busque esa posición (utilizamos fsetpos).

Sin embargo, cuando un archivo tiene mezclas de terminaciones de línea, este proceso no pudo buscar la misma posición. En nuestro caso (nuestra herramienta analiza C++), volvíamos a leer partes del archivo que ya habíamos visto.

Ir con binario: entonces puede controlar exactamente lo que se lee y escribe desde el archivo.

4

Otra diferencia es cuando se usa fseek

Si la corriente se abre en modo binario, la nueva posición es exactamente offset bytes, medidos desde el comienzo del archivo si el origen es SEEK_SET, desde el archivo actual posición si el origen es SEEK_CUR y desde el final del archivo si el origen es SEEK_END.Es posible que algunas transmisiones binarias no sean compatibles con SEEK_END.

Si la secuencia está abierta en modo texto, los únicos valores admitidos para desplazamiento son cero (que funciona con cualquier origen) y un valor devuelto por una llamada anterior a std :: ftell en una secuencia asociada con el mismo archivo (que sólo trabaja con origen de SEEK_SET

Cuestiones relacionadas