Diferencia entre archivos escritos en modo binario y texto
¿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);
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.
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
Además, cuando abre un archivo con "rt", la entrada termina en un carácter Crtl-Z.
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.