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 que no ocurre 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); 

Versus modo de 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 de texto” cuando se trate de transmisiones. En Windows, sin embargo, este no es el caso. Si echa un vistazo a la descripción de la función fopen () en: MSDN , verá que al especificar la opción “t” tendrá el siguiente efecto:

  • los feeds de línea (‘\ n’) se traducirán en ‘\ r \ n’ secuencias en salida
  • las secuencias de retorno de carro / avance de línea se traducirán a alimentaciones de línea en la entrada.
  • Si el archivo se abre en el modo de adición, el final del archivo se examinará 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 sobre los pecados de los padres visitados por sus hijos hasta la 3ª o 4ª generación). Contrariamente a la opinión establecida anteriormente, el carácter ctrl-z no se agregará.

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

Por lo general, querrás 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

Además, cuando abre un archivo con “rt”, la entrada finaliza en un carácter Crtl-Z.

Otra diferencia es cuando se usa fseek

Si la transmisión está abierta en modo binario, la nueva posición es exactamente bytes compensados ​​medidos desde el comienzo 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 transmisiones binarias no sean compatibles con SEEK_END.

Si la transmisión está abierta en modo texto, los únicos valores soportados 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.

Tuvimos un problema interesante al abrir archivos en modo texto donde los archivos tenían una mezcla de caracteres de final de línea:

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

Nuestro requisito es que podamos almacenar nuestra posición actual en el archivo (utilizamos fgetpos), cerrar el archivo y luego volver a abrir el archivo y buscar 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.

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