Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: AlbertoBSD en 9 Mayo 2016, 06:06 am



Título: Problema al escribir archivo - 0D le precede a 0A (Solucionado)
Publicado por: AlbertoBSD en 9 Mayo 2016, 06:06 am
Problema al escribir archivo...

Realmente estoy rompiéndome la cabeza desde hace unos 2 dias...  :silbar: :silbar: :silbar:

Al momento de guardar datos en un archivo escribo los datos de 2 bytes en 2 bytes.

Todo bien pero llega un momento en que el programa no guarda la información que debe de guardar, sin embargo si mando a imprimir lo que esta guardando esta información si es correcta, pero no la que se guarda en el archivo.

Código
  1. file = fopen(nombre,"a+");
  2. if(file) {
  3. debug("-primos[%i]",primos[offset]->valor,primos[offset]->bytes,offset);
  4. fwrite(primos[offset]->valor,primos[offset]->bytes,1,file);
  5. fclose(file);
  6. }
  7.  

Mando a llamar a una función debug para ver que es lo que se esta guardando, esta función me imprime el contenido de la memoria sin afectarlo...

Código
  1. void debug(char *s,unsigned char *ptr,unsigned int l,...) {
  2. va_list args;
  3. int i = 0;
  4. int len = strlen(s)*20;
  5. char *buffer;
  6. buffer = calloc(len,sizeof(char));
  7. va_start(args, l);
  8. vsprintf(buffer,s, args);
  9. printf("%s: 0x%x ",buffer,ptr);
  10. while(ptr && i < l) {
  11. printf("%.2x",ptr[i++]);
  12. }
  13. printf("\n");
  14. va_end(args);
  15. memset(buffer,0,len);
  16. free(buffer);
  17. }

Aquí lo importante es notar que llamo a fwrite para escribir en el archivo abierto con la opcion "a+"

Código
  1. debug("-primos[%i]",primos[offset]->valor,primos[offset]->bytes,offset);
  2. fwrite(primos[offset]->valor,primos[offset]->bytes,1,file);

La posición de memoria que se guarda es: primos[offset]->valor y la cantidad de bytes que se guardan con fwrite y se imprimen con debug es primos[offset]->bytes que para el ejemplo dado vale 2

La salida del programa va mas o menos asi...

Código:
-primos[54]: 0x567fd0 0101
-primos[55]: 0x567ef0 0701
-primos[56]: 0x567f10 0d01
-primos[57]: 0x567ff0 0f01
-primos[58]: 0x567f60 1501
-primos[59]: 0x567e60 1901
-primos[60]: 0x568000 1b01
-primos[61]: 0x567f20 2501
-primos[62]: 0x567f90 3301
-primos[63]: 0x568010 3701
-primos[64]: 0x568020 3901
-primos[65]: 0x567e80 3d01
-primos[66]: 0x567f40 4b01
-primos[67]: 0x567f50 5101
-primos[68]: 0x568030 5b01
...

y donde se presenta el problema es la siguiente:

Código:
-primos[372]: 0x568520 f509
-primos[373]: 0x568560 f709
-primos[374]: 0x5682c0 fd09
-primos[375]: 0x5683f0 130a
-primos[376]: 0x5682b0 1f0a
-primos[377]: 0x568570 210a
-primos[378]: 0x5681e0 310a
-primos[379]: 0x568390 390a
-primos[380]: 0x5683e0 3d0a
-primos[381]: 0x5681f0 490a
-primos[382]: 0x568330 570a
-primos[383]: 0x5683a0 610a
...


¿Nada anormal? Claro esa salida esta bien, el problema esta al guardar el archivo en ese ultimo segmento queda asi (Salida hexadecimal)

Código:
F509F709FD09130D0A1F0D0A210D0A310D0A390D0A3D0D0A490D0A570D0A610D0A630D0A670D0A6F0D0A750D0A7B0D0A7F0D0A810D0A850D0A8B0D0A930D0A970D0A990D0A9F0D0AA90D0AAB0D0AB50D0ABD0D0AC10D0ACF0D0AD90D0AE50D0AE70D0AED0D0AF10D0AF30D0A030B110B150B1B0B

Ahora que lo veo Noto un recurrente 0D y no tengo ni idea de donde sale, el detalle no veo error en donde se guarda el archivo repito:

Código
  1. debug("-primos[%i]",primos[offset]->valor,primos[offset]->bytes,offset);
  2. fwrite(primos[offset]->valor,primos[offset]->bytes,1,file);

En teoría lo que se muestra en la salida estándar y en el archivo creado debería de ser lo mismo primos[offset]->valor

Si a alguien le a pasado algo similar o de plano ve un error que yo no veo por favor avíseme.

No creo que sa detalle del sistema, el error se me presenta tanto en FreeBSD y en Windows


Título: Re: Problema al escribir archivo
Publicado por: tincopasan en 9 Mayo 2016, 12:27 pm
la verdad no le entiendo bien a la función, pero si sé que el 0D sale de los saltos de línea, o sea "\n"


Título: Re: Problema al escribir archivo
Publicado por: AlbertoBSD en 9 Mayo 2016, 13:11 pm
Gracias, lo interesante que aparece el 0D y aparece en medio del numero a imprimir.

Código:
-primos[372]: 0x568520 f509 -> Sin cambios
-primos[373]: 0x568560 f709 -> Sin cambios
-primos[374]: 0x5682c0 fd09 -> Sin cambios
-primos[375]: 0x5683f0 130a  -> Escribe 130D0A
-primos[376]: 0x5682b0 1f0a  -> Escribe 1F0D0A
-primos[377]: 0x568570 210a  -> Escribe 210D0A
-primos[378]: 0x5681e0 310a  -> ...
-primos[379]: 0x568390 390a  ->
-primos[380]: 0x5683e0 3d0a  ->
-primos[381]: 0x5681f0 490a  ->
-primos[382]: 0x568330 570a  ->
-primos[383]: 0x5683a0 610a  ->
...

Todos los 0A precedidos por 0D.. esto huele a windows o creo que es algun problema de gcc del DEV C



Viendo que era problema de ese caracter exclusivamente me imagine que era la comvinacion \n\r  busque en google y puff

http://stackoverflow.com/questions/5537066/strange-0x0d-being-added-to-my-binary-file

Solucion abrir el archivo anexandole 'b' al fopen

Saludos