Foros del Web » Programación para mayores de 30 ;) » C/C++ »

lectura de ficheros con fread en c

Estas en el tema de lectura de ficheros con fread en c en el foro de C/C++ en Foros del Web. bueno mi duda es muy básica. pero por mucho que la miro, no termino de entender que pasa: tengo este código: int bienvenida(char nombre[10]) { ...
  #1 (permalink)  
Antiguo 14/02/2011, 10:49
 
Fecha de Ingreso: octubre-2010
Ubicación: madrid
Mensajes: 10
Antigüedad: 13 años, 7 meses
Puntos: 0
Pregunta lectura de ficheros con fread en c

bueno mi duda es muy básica. pero por mucho que la miro, no termino de entender que pasa:

tengo este código:


int bienvenida(char nombre[10])
{
FILE *fichero_nombres;//el puntero para gestionar el fichero
int opcion, contador=1;
char letra;
printf("Bienvenido al juego de tres en raya\n\n");
printf("1. JUGADOR NUEVO\n");
printf("2. JUGADOR REGISTRADO\n");
scanf("%i", &opcion);
switch(opcion)
{
case 1:
fflush(stdin);
printf("Debes registrarte antes de comenzar para formar parte del ranking y las estadísticas");
printf("Introduce tu nombre(maximo 10 caracteres):\n\n");

fichero_nombres = fopen("jugadores.txt","a");//se posiciona al final del archivo
if(fichero_nombres== NULL)
{
printf("Problema con los ficheros.\n");
exit( 1 );
}

gets(jugador.nombre);
fwrite( &jugador, sizeof(jugador), 1, fichero_nombres );
printf("Gracias por registrarte\n");
break;
case 2:
fichero_nombres = fopen("jugadores.txt","r");//se posicionaen el archivo para lectura
if(fichero_nombres== NULL)
{
printf("Problema con los ficheros.\n");
exit( 1 );
}

printf("Elije tu nombre de la siguiente lista:\n");
do
{
printf("%i. ", contador);
fread( &jugador, sizeof(jugador), 1, fichero_nombres );
contador++;
printf("%s\n\n", jugador.nombre);
}while ( feof(fichero_nombres)==0 );
break;

}

el problema reside aquí al final del archivo. a la hora de listar los nombres de los jugadores registrados, el ultimo se repite. es decir si el ultimo es Jonathan, pone:

1.jose
2.marcos
3.jonathan
4.jonathan

por que se repite?alguien podría ayudarme? y darme un breve explicación del porque?

gracias por anticipado.
  #2 (permalink)  
Antiguo 14/02/2011, 11:30
 
Fecha de Ingreso: octubre-2010
Ubicación: madrid
Mensajes: 10
Antigüedad: 13 años, 7 meses
Puntos: 0
Respuesta: lectura de ficheros con fread en c

el código entero es el siguiente:


#include <stdio.h>
#include <stdlib.h>

struct {
char nombre[10];
int victorias;
int derrotas;
int partidas_totales;
}jugador;


int bienvenida(char nombre[10])
{
FILE *fichero_nombres;//el puntero para gestionar el fichero
int opcion, contador=1;
char letra;
printf("Bienvenido al juego de tres en raya\n\n");
printf("1. JUGADOR NUEVO\n");
printf("2. JUGADOR REGISTRADO\n");
scanf("%i", &opcion);
switch(opcion)
{
case 1:
fflush(stdin);
printf("Debes registrarte antes de comenzar para formar parte del ranking y las estadísticas");
printf("Introduce tu nombre(maximo 10 caracteres):\n\n");

fichero_nombres = fopen("jugadores.txt","a");//se posiciona al final del archivo
if(fichero_nombres== NULL)
{
printf("Problema con los ficheros.\n");
exit( 1 );
}

gets(jugador.nombre);
fwrite( &jugador, sizeof(jugador), 1, fichero_nombres );
printf("Gracias por registrarte\n");
break;
case 2:
fichero_nombres = fopen("jugadores.txt","r");//se posicionaen el archivo para lectura
if(fichero_nombres== NULL)
{
printf("Problema con los ficheros.\n");
exit( 1 );
}

printf("Elije tu nombre de la siguiente lista:\n");
do
{
printf("%i. ", contador);
fread( &jugador, sizeof(jugador), 1, fichero_nombres );
contador++;
printf("%s\n\n", jugador.nombre);
}while ( feof(fichero_nombres)==0 );
break;
//tengo un problema: me repite el ultimo numero
}

}




int main(int argc, char *argv[])
{
char nombre_jugador[10];
bienvenida(nombre_jugador);


system("PAUSE");
return 0;
}


¿alguien me podría ayudar? gracias
  #3 (permalink)  
Antiguo 15/02/2011, 16:09
 
Fecha de Ingreso: enero-2008
Mensajes: 229
Antigüedad: 16 años, 3 meses
Puntos: 1
Respuesta: lectura de ficheros con fread en c

no deberias utilizar feof para ver si ya leyeron todos los registros.
hazlo de la siguiente forma

fseek(fichero_nombres , 0, SEEK_END);
int numReg= ftell(fichero_nombres)/sizeof(jugador);
rewind(fichero_nombres );
int i=0;

for(i = 0; i< numReg; ++i)
{
printf("%i. ", i+1);
fread( &jugador, sizeof(jugador), 1, fichero_nombres );
printf("%s\n\n", jugador.nombre);
}

para mayor información de como usar estas funciones

http://www.cplusplus.com/reference/c.../cstdio/fseek/

Etiquetas: ficheros, lectura
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 15:44.