[ Foro de C ]

Problema con fread/fwrite y fseek

07-Apr-2011 12:37
Raul C
1 Respuestas

Hola, sigo estudiando para haber si soy capaz de aprender C pero siempre me estanco, la verdad es que estoy muy cabreado ya porque no logro aprenderlo. En el tema de la agenda y mas concretamente en el uso de fread/fwrite y fseek estoy muy liado y realmente no me entero nada de lo que hacen cada uno. Podrias poner las Soluciones de los ejercicios para ver si realmente los hacemos bien o no? dejo el ejercicio que he echo yo que realmente no se si esta bien o no.

------------------------------------------------------------------
/*Ejercicio Pag 101 del .pdf punto 6.9 Acceder a cualquier posición de un fichero:
* Ampliar el programa anterior (el “array de structs” con 10 personas) para que el dato que indique el usuario se lea sin leer y descartar antes los que le preceden, sino que se
salte directamente a la ficha deseada usando “fseek”.*/

#include <stdio.h>

int main()
{
struct
{
 char nombre[21];
 char edad[3];
 char ciudad[21];
}datos[5]; //Pongo 5 para que no sea tan pesado

FILE *fich;

int i;
int NF = 0;
int numero;
int position;
int valorFicha;

fich = fopen("rep-ejercicios\\gente3.dat","wb");

if(fich == NULL)
 printf("\n No se ha podido abrir el Fichero, mire bien la ruta y los permisos.\n\n");
 //exit(1);
if(NF < 5)
{
 for(i=0;i<5;i++)
 {
  printf("\n Nombre: ");
  gets(datos[i].nombre);
  printf("\n Edad: ");
  gets(datos[i].edad);
  printf("\n Ciudad: ");
  gets(datos[i].ciudad);
  printf("\n ------------------------------------------\n");
  //escribimos datos en fichero
  fwrite(datos[i].nombre,1,sizeof(datos[i].nombre),fich);
  fwrite(datos[i].edad,1,sizeof(datos[i].edad),fich);
  fwrite(datos[i].ciudad,1,sizeof(datos[i].ciudad),fich);
 
  NF++;
 }
}

fclose(fich);

//Pedimos Numero
printf("\n Inserta un numero del 1 al 5: ");
scanf("%d",&numero);

if(numero < 0 || numero > 4)
 printf("\n\n Tienes que poner un numero entre 1 y 5\n\n");

//abrimos fichero en modo lectura
fich = fopen("rep-ejercicios\\gente2.dat","rb");

for(i=0;i<5;i++)
{
 if((numero-1) == i)
 {
  valorFicha = sizeof(datos[i].nombre)+sizeof(datos[i].edad)+sizeof(datos[i].ciudad) / numero;
  fseek(fich,valorFicha,SEEK_SET);
  position = ftell(fich);
  printf("\nPosicion: %d \n Nombre: %s \n Edad: %s \n Ciudad: %s \n",position,datos[i].nombre,datos[i].edad,datos[i].ciudad);
 }
}

getchar();
getchar();
return 0;
}


12-Apr-2011 22:52
Nacho Cabanes (+83)

Empieza por algo más sencillo. Por ejemplo: un fichero que contenga 5 números enteros. Con un menú, el usuario elige qué numero se quiere leer. Cuando lo ha escogido, se lee ese número y se muestra su valor en pantalla. El programa se repite hasta que se teclee el número 0.

Es que tienes algún fallo de concepto, porque no entiendo por qué haces cosas como éstas:

valorFicha = sizeof(datos[i].nombre)+sizeof(datos[i].edad)+sizeof(datos[i].ciudad) / numero;

En primer lugar, basta con calcular el tamaño de todo el struct, no hace falta sumar cada uno de sus componentes. En segundo lugar, no entiendo por qué divides ese tamaño. El tamaño se usa en el "fread", y se indica el de todo el dato.

fseek(fich,valorFicha,SEEK_SET);

Aquí, ese "valorFicha" debería ser la posición en la que está el dato.

Lo dicho, intenta hacer la versión sencilla, con sólo 5 números enteros, y pon el fuente, para ver dónde estás fallando.






(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)