Autor
|
Tema: Duda con fread (Leído 2,617 veces)
|
Gr1nD3r
Desconectado
Mensajes: 13
|
Buenas. Antes que nada, el codigo: #include <stdio.h> #include <stdlib.h> #include <string.h> int main(){ struct{ char nombre[50]; char direccion[100]; char movil[10]; char email[100]; short int nDia; short int nMes; short int nAno; }persona; int i; int opcion=1; //Opcion elegida por le usuario char textoTemporal[40]; FILE *fichero; while(opcion != 0){ printf("1.- A%cadir ficha nueva\n\n",164); printf("2.- Visualizar nombres de fichas existentes\n\n"); printf("3.- Buscar por nombre\n\n"); sscanf(textoTemporal ,"%d",&opcion ); switch(opcion){ case 1: fichero =fopen("gente.dat","ab"); printf("Dia de nacimiento: "); sscanf(textoTemporal ,"%d",&persona. nDia); printf("Mes de nacimiento: "); sscanf(textoTemporal ,"%d",&persona. nMes); printf("Año de nacimiento: "); sscanf(textoTemporal ,"%d",&persona. nAno); fwrite(&persona ,1,sizeof(persona ),fichero ); break; case 2: fichero =fopen("gente.dat","rb"); while(feof(fichero ) == 0){ fread(&persona ,1,sizeof(persona ),fichero ); } break; case 3: printf("Introduzca el nombre de la persona: "); fichero =fopen("gente.dat","rb"); fread(persona. nombre,1,sizeof(persona. nombre),fichero ); fread(persona. direccion,1,sizeof(persona. direccion),fichero ); fread(persona. movil,1,sizeof(persona. movil),fichero ); fread(persona. email,1,sizeof(persona. email),fichero ); fread(&persona. nDia,sizeof(persona. nDia),1,fichero ); fread(&persona. nMes,sizeof(persona. nMes),1,fichero ); fread(&persona. nAno,sizeof(persona. nAno),1,fichero ); if((strcmp(persona. nombre,textoTemporal )== 0)){ printf("Dia de nacimiento: %d\n",persona. nDia); printf("Mes de nacimiento: %d\n",persona. nMes); printf("A%co de nacimiento: %d\n",164,persona. nAno); } }3 } return 0; }
El problema es el siguiente: Cuando escojo la opcion 2, se deben mostrar todos los nombres de las fichas guardadas. Pero el ultimo nombre siempre se repite y se imprime en pantalla dos veces. Alguien sane a que se debe???? pd: La opcion 3 no esta mal, aun no la he modificado GRACIAS!!
|
|
« Última modificación: 10 Agosto 2010, 21:49 pm por Littlehorse »
|
En línea
|
|
|
|
Littlehorse
All the world's a stage
Moderador
Desconectado
Mensajes: 2.714
Nie Dam Sie
|
Lo primero es que no utilices gets, es peligrosa y logra que tu programa sea propenso a errores, desbordamiento de buffer, etc. Utiliza fgets. En cuanto al error, no he visto todo el código pero viendo la parte relevante a la pregunta en cuestión: while(feof(fichero ) == 0) { fread(&persona ,1,sizeof(persona ),fichero ); }
El error es sencillo, nunca debes utilizar feof de esa forma para comprobar el final de un archivo en un ciclo. feof devuelve verdadero después de pasar EOF, no al alcanzarlo. Lo que sucede respectivamente es que fread lee el ultimo dato, pero no el final del archivo. Entonces al intentar leer nuevamente, se produce un error, y lo que haya quedado en el buffer se vuelve a imprimir porque la condición del ciclo, según feof, todavía no se ha cumplido. No te pongo la función porque es fácil de solucionar y creo que va a ser mas productivo que la hagas vos mismo, pero como pista te digo que puedes valerte de una combinación de feof y el valor de retorno de fread, o bien solamente de este ultimo. Recordando que el valor de retorno de fread implica: Return Value The total number of elements successfully read is returned as a size_t object, which is an integral data type. If this number differs from the count parameter, either an error occured or the End Of File was reached. You can use either ferror or feof to check whether an error happened or the End-of-File was reached. Saludos
|
|
|
En línea
|
An expert is a man who has made all the mistakes which can be made, in a very narrow field.
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
fread y fwrite con clases
Programación C/C++
|
newone
|
4
|
4,888
|
23 Junio 2011, 23:40 pm
por newone
|
|
|
Usos fwrite, fread
Programación C/C++
|
diegoCmC
|
4
|
5,592
|
13 Septiembre 2012, 21:42 pm
por diegoCmC
|
|
|
Ayuda con basura en fread
Programación C/C++
|
harry_the_blogger
|
3
|
2,295
|
2 Abril 2016, 15:30 pm
por class_OpenGL
|
|
|
fread
Programación C/C++
|
saltimbanki
|
1
|
2,885
|
21 Diciembre 2020, 20:27 pm
por Eternal Idol
|
|
|
fread me muestra algunos hexadecimales de forma incorrecta
Programación C/C++
|
otroWeyMas.nasm
|
3
|
2,639
|
2 Febrero 2022, 19:31 pm
por Eternal Idol
|
|