Diferencia entre archivos escritos en modo binario y texto

Resuelto jholl asked hace 16 años • 7 respuestas

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

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);

Frente al modo texto:

FILE *fp_text = fopen(filename, "wt");
fwrite(buffer, size, count, fp_text);
jholl avatar Oct 23 '08 21:10 jholl
Aceptado

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

  • los avances de línea ('\n') se traducirán a secuencias '\r\n" en la salida
  • Las secuencias de retorno de carro/avance de línea se traducirán a avances de línea en la entrada.
  • Si el archivo se abre en modo de agregar, se examinará el final del archivo en busca de un carácter Ctrl-z (carácter 26) y ese carácter se eliminará, si es posible. También interpretará la presencia de ese personaje como el final del archivo. Este es un vestigio desafortunado de los días del CPM (algo acerca de los pecados de los padres que recaen sobre sus hijos hasta la tercera o cuarta generación). Contrariamente a la opinión expresada anteriormente, no se agregará el carácter Ctrl-z.
Jon Trauntvein avatar Oct 23 '2008 18:10 Jon Trauntvein

En modo texto, una nueva línea "\n" se puede convertir en un retorno de carro + nueva línea "\r\n"

Normalmente querrás abrir en modo binario. Intentar leer datos binarios en modo texto no funcionará, se dañará. Sin embargo, puedes leer el texto correctamente en modo binario; simplemente no realizará traducciones automáticas de "\n" a "\r\n".

Ver fopen

Zebra North avatar Oct 23 '2008 14:10 Zebra North

Además, cuando abre un archivo con "rt", la entrada termina en un carácter Crtl-Z.

SmacL avatar Oct 23 '2008 14:10 SmacL

Otra diferencia es cuando se utilizafseek

Si la secuencia está abierta en modo binario, la nueva posición está exactamente compensada en bytes medidos desde el principio del archivo si el origen es SEEK_SET, desde la posición actual del archivo si el origen es SEEK_CUR y desde el final del archivo si el origen es SEEK_END. Es posible que algunas secuencias binarias no admitan SEEK_END.

Si la secuencia está abierta en modo texto, los únicos valores admitidos para el 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 solo funciona con origen de SEEK_SET.

Ming avatar Jul 17 '2014 08:07 Ming