Ver Mensaje Individual
  #4 (permalink)  
Antiguo 31/03/2015, 07:10
eferion
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 7 meses
Puntos: 204
Respuesta: Problema en C con fread y fwrite

Código C:
Ver original
  1. if(strlen(Buffer)>0) Buffer[strlen(Buffer)-1]='\0';

strlen() tiene internamente un contador... al pasarle un puntero empieza a recorrerlo hasta que encuentra un caracter nulo ('\0'), incrementando su contador interno por el camino. Una vez localizado este carácter devuelve el valor del contador.

Dicho esto, Buffer[strlen(Buffer)-1]='\0' va a eliminar SIEMPRE el último caracter de la secuencia leída. Es decir, si tenías 'HOLA\0' te vas a quedar con 'HOL\0'. No entiendo la utilidad de esa línea.

Y, por cierto, aquí te sucede lo mismo:

Código C:
Ver original
  1. fgets(Datos[X].Name,sizeof(Datos[X].Name),stdin);
  2. Datos[X].Name[strlen(Datos[X].Name)-1]='\0';

Seguimos...

Código C:
Ver original
  1. while(!feof(Agenda)){
  2.     // ...
  3.     if(feof(Agenda)) break;
  4.     // ...
  5.     if(feof(Agenda)) break;
  6.     // ...
  7.     if(feof(Agenda)) break;
  8.     // ...
  9.     if(feof(Agenda)) break;
  10.     // ...
  11.     if(feof(Agenda)) break;
  12.     // ...
  13.     if(feof(Agenda)) break;
  14.     // ...
  15.     if(feof(Agenda)) break;
  16. }

la condición del "while" no va a fallar nunca porque feof() no se actualiza hasta que no realizas una lectura fallida... y entre el último feof() del bucle y la condición del while no hay ningúna operación sobre el fichero...

puedes dejarlo como

Código C:
Ver original
  1. while( 1 )
  2. {
  3.   // ...
  4. }

o así

Código C:
Ver original
  1. do
  2. {
  3.     // ...
  4.     if(feof(Agenda)) break;
  5.     // ...
  6.     if(feof(Agenda)) break;
  7.     // ...
  8.     if(feof(Agenda)) break;
  9.     // ...
  10.     if(feof(Agenda)) break;
  11.     // ...
  12.     if(feof(Agenda)) break;
  13.     // ...
  14.     if(feof(Agenda)) break;
  15.     // ...
  16.     // if(feof(Agenda)) break; <-- comentado
  17. } while( !feof( ) );

más que nada porque la condición del while, tal y como está el código, no va a devolver false en la vida.

Código C:
Ver original
  1. fgets(Buffer,200,Agenda);
  2. if(feof(Agenda)) break;
  3. if(strlen(Buffer)>0) Buffer[strlen(Buffer)-1]='\0';
  4. strcpy(Datos[X].Name,Buffer);

No se si te has dado cuenta, pero te puedes ahorrar el uso de "Buffer"... primero haces una copia del fichero a "Buffer" y después copias ese mismo contenido de "Buffer" a la estructura "Datos"... ¿Por qué no haces una copia directa a "Datos"?

Algo así:

Código C:
Ver original
  1. fgets(Datos[X].Name,200,Agenda);
  2. if(feof(Agenda)) break;

Por otro lado, no se si te has dado cuenta, pero "Buffer" tiene tamaño 200 y "Name", "Address" y "Email" tienen tamaño 100... si editas el archivo a mano y aumentas la longitud de uno de esos campos por encima de 100 vas a pisar memoria... para evitar eso puedes valerte de "sizeof"

Código C:
Ver original
  1. fgets(Datos[X].Name, sizeof(Datos[0].Name), Agenda );
  2. if(feof(Agenda)) break;

Así te evitas el desbordamiento del buffer.

Otra cosilla: dado que utilizas 'X' para controlar el número máximo de elementos... "Algodon" es otra variable que te puedes ahorrar... básicamente cambia el if por:

Código C:
Ver original
  1. if( X == 0 ){
  2.     printf("No hay datos que leer...\n\n");
  3. }

Y listo.

Y, bueno, entiendo que este programa te funciona... ¿Qué problemas tienes al cambiar fgets por fread???