CCG en Windows
#include <stdio.h> #include <stdlib.h> struct test { int n1; int n2; }; int main() { FILE *f; f = fopen("test.dat", "w"); struct test test1 = {10, 10}; fwrite(&test1, sizeof(struct test), 1, f); fclose(f); struct test test2; f = fopen("test.dat", "r"); while(fread(&test2, sizeof(struct test), 1, f)) printf("n1=%d n2=%d\n", test2.n1, test2.n2); fclose(f); return 0; } Si configuro test1 en 10,10 , entonces fwrite escribirá 10 bytes en el archivo: 0D 0A 00 00 00 0D 0A 00 00 00
(cada int de 4 bytes se rellenará con un carácter de retorno de carro 0D antes)
Si configuro test1 en 11,11 , entonces fwrite escribirá 8 bytes en el archivo: 0B 00 00 00 0B 00 00 00
(como era de esperar)
Si configuro test1 en 9,9 , fwrite escribirá 8 bytes en el archivo: 09 00 00 00 09 00 00 00
(como era de esperar)
Si configuro test1 en 9,10 , fwrite escribirá 9 bytes en el archivo: 09 00 00 00 0D 0A 00 00 00
El 9 obtiene 4 bytes como se esperaba, pero el 10 se rellena con un byte 0D adicional, lo que da como resultado 5 bytes. ¿Qué tiene de especial el número 10 que requiere este relleno? ¿Y por qué los números más pequeños y más grandes (8, 9, 11, 12, 13, 14, etc.) no se rellenan? Pensé que tal vez GCC estaba confundiendo el número 10 con un carácter de nueva línea (una nueva línea es 10 es acsii), pero esto no explica cómo fread puede recuperar el número 10 correctamente.
¿Y cómo escribo una estructura para archivar sin obtener este relleno adicional en el número 10?
Abrió el archivo en modo de texto , por lo que en Windows cada carácter '\n' tiene un retorno de carro antepuesto.
Debería escribir (y leer) datos binarios en modo binario ( fopen(..., "wb") ) -- esto será mucho más rápido y evitará sorpresas (y también requiere solo 8 bytes, que es el tamaño de sizeof(struct test) es).
¿Qué tiene de especial el número 10 que requiere este relleno?
El número 10 resulta ser el código ASCII para un carácter de nueva línea ( '\n' ).
Está escribiendo y leyendo en modo texto.
Abra el archivo con las banderas "wb" y "rb". Esto tratará los archivos como archivos binarios.