Grabar estructura en archivo [lenguaje C] [Windows 7]

Iniciado por DanielPy, 9 Marzo 2015, 18:41 PM

0 Miembros y 1 Visitante están viendo este tema.

rir3760

Cita de: DanielC# en 13 Marzo 2015, 20:55 PMLo último es un inconveniente con el bucle while, siempre me duplica el último dato.
El problema se debe a que estas utilizando feof para controlar el bucle de lectura y con ello se realiza una iteración de mas:
printf( "\n\n Listado completo\n" );
while( !feof(ptrEst) ){
   fread(&est, sizeof(est), 1, ptrEst);
   printf( " %d - %s \n", est.matricula, est.nombre );
}

La solución manteniendo el uso de la función feof ya te la dio BloodSharp, solo ten cuidado con el bucle ya que son dos expresiones separadas por el operador condicional ",".

Otra opción consiste en olvidarse de feof, temas relacionados con ello los puedes consultar mediante el motor de búsqueda de los foros, lo usual salvo casos excepcionales es, en lugar del uso de la bendita función, utilizar el valor de retorno de la función en turno. En tu caso basta con:
puts("Listado completo:");
while (fread(&est, sizeof est, 1, ptrEst) == 1)
   printf(" %d - %s \n", est.matricula, est.nombre);


Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

DanielPy

Hola rir3760.
Ahora si funciona correctamente, sólo que la primer parte quedo de esta manera (lo copié de este foro).-

......................
......................
long tam;
......................
......................
tam=sizeof(struct registro);
fseek(ptrEst, 0, SEEK_END);
ultimaMatricula=ftell(ptrEst)/tam;
est.matricula = ultimaMatricula+1;

printf( "\n Matricula......: %d",  est.matricula);

Sólo una cosita más, me podrías decir el significado de == 1, debo interpretar que si es cero termina el bucle, no se.-

Saludos.
Daniel
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor
y cuando lo abrazas dejan de causar dolor.-

rir3760

Cita de: DanielC# en 14 Marzo 2015, 04:00 AMSólo una cosita más, me podrías decir el significado de == 1, debo interpretar que si es cero termina el bucle
Correcto. La función fread retorna el numero de elementos leídos con éxito y este valor sera igual o menor al tercer argumento de la función (en tu caso y en resumen 1 ==> lectura exitosa, 0 ==> error o fin de archivo).

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language