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

ir a un registro concreto para leerlo

Estas en el tema de ir a un registro concreto para leerlo en el foro de C/C++ en Foros del Web. Hola, tengo el siguiente programa que consiste en almacenar N registros en un fichero e ir a un registro concreto y mostrarlo en pantalla, pero ...
  #1 (permalink)  
Antiguo 06/04/2010, 11:10
 
Fecha de Ingreso: febrero-2010
Mensajes: 258
Antigüedad: 14 años, 2 meses
Puntos: 0
ir a un registro concreto para leerlo

Hola, tengo el siguiente programa que consiste en almacenar N registros en un fichero e ir a un registro concreto y mostrarlo en pantalla, pero no me funciona:

Código C:
Ver original
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. /*Permite escribir nombres con espacio en blanco*/
  4. #define LEE_CAD(c,n) { int i=0;\
  5.                      c[i]=getchar();\
  6.                      while((c[i]=='\n') || (c[i]=='\t')) c[i]=getchar();\
  7.                      while((c[i]!='\n') && (i < (n-1))){ \
  8.                         i++;\
  9.                         c[i]=getchar();}\
  10.                       c[i]='\0';}
  11.  
  12. struct persona{
  13.    char nom[20];
  14.    char apellidos[100];
  15.    char edad[3];
  16. };
  17.  
  18. int main(){
  19.  
  20.    void alta_persona();
  21.    void mostrar_registro();
  22.    alta_persona();
  23.    mostrar_registro();
  24.    exit(0);
  25. }
  26.  
  27. void alta_persona(){
  28.     FILE *pf;
  29.     char otro;
  30.     struct persona datos;
  31.  
  32.    if((pf=fopen("persona.dat", "wb"))==NULL){
  33.         perror("Error al abrir el fichero datos_persona.\n");
  34.         exit(1);
  35.    }
  36.    
  37.    do{
  38.       printf("Introduce el nombre: ");
  39.       LEE_CAD(datos.nom,20);
  40.       printf("Introduce los apellidos: ");
  41.       LEE_CAD(datos.apellidos,100);
  42.       printf("Introduce la edad: ");
  43.       scanf("%2s",datos.edad);
  44.       fwrite(&datos, sizeof(datos), 1, pf);
  45.       printf("¿Otra persona?(s/n) ");
  46.       otro=getchar();
  47.       while((otro==' ')||(otro=='\n')||(otro=='\t'))
  48.            otro=getchar();  
  49.    }while((otro=='s')||(otro=='S'));  
  50.    if(fclose(pf)==EOF){
  51.       printf("Error al cerrar el fichero\n");
  52.       exit(2);
  53.    }
  54. }
  55.  
  56. void mostrar_registro(){
  57.         FILE *pf;
  58.         struct persona datos;
  59.        
  60.         if((pf=fopen("persona.dat", "rb"))==NULL){
  61.         perror("Error al abrir el fichero datos_persona.\n");
  62.         exit(3);
  63.         }      
  64.         fseek(pf, 2, SEEK_SET);
  65.         fread(&datos, sizeof(datos), 1, pf);
  66.         printf("%s %s %s\n", datos.nom, datos.apellidos, datos.edad);
  67.         fclose(pf);
  68. }

Cuando lo compilo en lugar de salirme por pantalla el registro 2 que es lo que pongo en la función fseek me sale esto: guel angel pez Perez. ¿Por qué no me sale el registro 2 qe es el yo pido?. Gracias.
  #2 (permalink)  
Antiguo 06/04/2010, 11:47
 
Fecha de Ingreso: junio-2008
Ubicación: Seattle, USA
Mensajes: 733
Antigüedad: 15 años, 11 meses
Puntos: 61
Respuesta: ir a un registro concreto para leerlo

Estas usando un 2 en fseek. El 2 especifica cuantos bytes moverse desde el inicio, no cuantos "registros" moverse. fseek es basico, no entiende de registros, solo bytes.

Etiquetas: registro
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 04:41.