Problema al escribir archivo - 0D le precede a 0A (Solucionado)

Iniciado por AlbertoBSD, 9 Mayo 2016, 06:06 AM

0 Miembros y 2 Visitantes están viendo este tema.

AlbertoBSD

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.

file = fopen(nombre,"a+");
if(file) {
debug("-primos[%i]",primos[offset]->valor,primos[offset]->bytes,offset);
fwrite(primos[offset]->valor,primos[offset]->bytes,1,file);
fclose(file);
}


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...


void debug(char *s,unsigned char *ptr,unsigned int l,...) {
va_list args;
int i = 0;
int len = strlen(s)*20;
char *buffer;
buffer = calloc(len,sizeof(char));
va_start(args, l);
vsprintf(buffer,s, args);
printf("%s: 0x%x ",buffer,ptr);
while(ptr && i < l) {
printf("%.2x",ptr[i++]);
}
printf("\n");
va_end(args);
memset(buffer,0,len);
free(buffer);
}


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

debug("-primos[%i]",primos[offset]->valor,primos[offset]->bytes,offset);
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...

-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:

-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)

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:

debug("-primos[%i]",primos[offset]->valor,primos[offset]->bytes,offset);
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
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW

tincopasan

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"

AlbertoBSD

#2
Gracias, lo interesante que aparece el 0D y aparece en medio del numero a imprimir.

-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
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW