Discussion:
Escribiendo un unsigned long en un archivo
(demasiado antiguo para responder)
gael
2004-06-06 14:00:52 UTC
Permalink
Socorro, me estoy volviendo loco.

El siguiente programa:

int _tmain()
{
unsigned long num4;
FILE * salida;

num4=2556;
salida=fopen("c:\\testsalida", "w");

fwrite(&num4, 4, 1, salida);
return 0;
}

genera un archivo de salida que, examinándolo con un editor
hexadecimal, veo que contiene:

fc 09 00 00

Es muy lógico, ya que aquí tenemos los cuatro bytes que ocupa un
unsigned long, en formato little endian, y el numerito escrito es 09fc
que en decimal es 2556. O sea, el resultado previsto.


Pero ahora veamos este otro, que sólo tiene una diferencia respecto al
primero: ahora el valor de la variable num4 es 2564 en lugar de 2556

int _tmain()
{
unsigned long num4;
FILE * salida;

num4=2564;
salida=fopen("c:\\testsalida", "w");

fwrite(&num4, 4, 1, salida);
return 0;
}

Yo, ingenuo, hubiera esperado que al ver el archivo de salida en el
editor hexadecimal apareciese ante mis ojos:

04 0a 00 00

que es a04, que en decimal es 2564.

Pero en lugar de eso hay esto:

04 0d 0a 00 00

Me pregunto de dónde sale el "quinto byte", ese 0d, que está ahí en
medio.

¿Se os ocurre algo?

Un saludo.
Lokutus
2004-06-06 15:48:31 UTC
Permalink
El tal gael en la fecha Domingo 06 Junio 2004 16:00 escribio en
Post by gael
Yo, ingenuo, hubiera esperado que al ver el archivo de salida en el
04 0a 00 00
En linux con gcc funciona de muerte. ¿que $%&$%&$%& de compilador estas
Post by gael
int _tmain()
:-)

Prueba a crear el archivo en modo binario: "wb" y luego me cuentas
--
Lokutus, asimilando la red.
gael
2004-06-06 22:50:40 UTC
Permalink
Hola :-D
Post by Lokutus
En linux con gcc funciona de muerte. ¿que $%&$%&$%& de compilador estas
Post by gael
int _tmain()
:-)
Aciertaaaas, valeeee, pero me da el mismo resultado con djgpp...
Post by Lokutus
Prueba a crear el archivo en modo binario: "wb" y luego me cuentas
Mano de santo. Muchas gracias!! Llevaba dos días al borde del delirio.
Tendré que aprender C. :-)

Un saludito.
Lokutus
2004-06-07 23:26:58 UTC
Permalink
El tal gael en la fecha Lunes 07 Junio 2004 00:50 escribio en
Post by gael
Post by Lokutus
Prueba a crear el archivo en modo binario: "wb" y luego me cuentas
Mano de santo. Muchas gracias!! Llevaba dos días al borde del delirio.
Tendré que aprender C. :-)
Fijate en un detalle:

Cuando escribías "04 0a 00 00"

El 0a, lo interpretaba como un caracter LF, un salto de linea, y
por eso antes le mete un CR, (Retorno de carro), es decir, un 0d.

Por que en DOS y Windows, las lineas de texto acaban en "CR + LF".

Aunque no lo he probado, estoy seguro de que si se encontrara un 0d,
metería despues un 0a.

En un MAC, sospecho que sustituiría los 0a que se encontrara por 0d,
es decir, escribiría cuatro caracteres, pero no el valor que esperabas.

Y en mi Linux, ha funcionado de casualidad, por que mucho me temo, que
sustituiría los 0d por 0a. Pero como ya había un 0a, lo ha dejado como
estaba.

Es decir, que de todas formas hay que añadir el "b" para no tener
sorpresas.
--
Lokutus, asimilando la red.
Antoine Leca
2004-06-07 13:27:34 UTC
Permalink
Post by gael
fwrite(&num4, 4, 1, salida);
Intenta coger un elemento de 4 bytes desde num4, y lo escribe a salida, que
es un archivo de texto. No se sabe que es un elemento de 4 bytes (un
unsigned long puede estar más largo); no se sabe tampoco que parte de num4,
si la de más o menos significación; no se sabe si se escribó bién. Y lo más
interesante, es que se escribe a un archivo que podría ser en Unicode, como
lo indica el hecho de llamar el programa principal _tmain, con el compilador
de Microsoft...


Antoine
Loading...