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

Problemas con apuntadores y archivos

Estas en el tema de Problemas con apuntadores y archivos en el foro de C/C++ en Foros del Web. Hola, estoy intentando hacer una agenda con los datos principales de una persona, lo trato de hacer con estructura y un array dinamico (apuntador) pero ...
  #1 (permalink)  
Antiguo 16/06/2009, 08:05
 
Fecha de Ingreso: enero-2009
Mensajes: 53
Antigüedad: 15 años, 3 meses
Puntos: 1
Información Problemas con apuntadores y archivos

Hola, estoy intentando hacer una agenda con los datos principales de una persona, lo trato de hacer con estructura y un array dinamico (apuntador) pero recien estoy entrando al tema de archivos y tambien deseaba incluirlo.

La cuestion es que ingrese los datos todo bien, luego voy al submenu mostrar y me sale pero una vez que quiero ingreso denuevo no me muestra el anterior (sobreescribe). Una vez cierro el programa y vuelvo a entrar y pongo mostrar y solo sale basura.

El problema creo q es en fread y fwrite pero no logro arreglarlo. Espero que me puedan ayudar aqui esta el codigo.


Código agenda:
Ver original
  1. #include <iostream.h>
  2. #include <stdlib.h>
  3. #include <stdio.h>
  4. #include <conio.h>
  5. #include <conio.c>
  6. #include <string.h>
  7. #include <math.h>
  8.  
  9. using std::iostream;
  10. using std::cout;
  11. using std::cin;
  12. using std::endl;
  13.  
  14.  
  15. struct fecha
  16. {
  17.    int dd;
  18.    int mm;
  19.    int aaaa;
  20. };
  21.  
  22. struct direccion
  23. {
  24.    char dir[50];
  25.    char disto[50];
  26.    char dpto[50];
  27.    char pais[50];
  28. };
  29.  
  30. struct persona
  31. {
  32.    char cod[8];
  33.    char ap[20];
  34.    char am[20];
  35.    char nom[50];
  36.    int sex;
  37.    fecha fnac;
  38.    direccion dir;
  39. };
  40. //declaracion de funciones
  41. //************************
  42. int menu();
  43. void lecturapers(persona **p,int *dim);
  44. void mostrarpers(persona *p,int dim);
  45.  
  46. //Principal
  47. //*********
  48. int main()
  49. {   persona *a;
  50.     int opcion,n;
  51.     textbackground(15);
  52.     textcolor(0);
  53.     do{
  54.       system("cls");
  55.       opcion=menu();
  56.      
  57.       switch(opcion)
  58.             {
  59.              case 0: exit(1);
  60.              case 1: system("cls");
  61.                      lecturapers(&a,&n);
  62.                      break;
  63.              case 2: system("cls");
  64.                      mostrarpers(a,n);
  65.                      break;
  66.             }
  67.     }while(opcion);
  68.        
  69.        
  70.    
  71.        
  72.  
  73.       system("PAUSE");
  74.       return 0;
  75. }
  76.  
  77. //Menu de Opciones
  78. //****************
  79. int menu()
  80. {   int op;
  81.    
  82.     cout<<"\n \t\t\t   DIRECTORIO TELEFONICO\n";
  83.     cout<<"\t\t\t    ---------------------\n\n\n";
  84.     cout<<"\t\t\t   [1]Ingresar Datos\n";
  85.     cout<<"\t\t\t   [2]Mostrar Personas\n";
  86.     cout<<"\t\t\t   [0]Salir del directorio\n\n";
  87.     do{
  88.        cout<<"\n\t\t\t   Elige la opcion=";
  89.        cin>>op;
  90.     }while(op<0 && op>8);
  91.     return(op);
  92.  
  93. }
  94.  
  95. //Lectura de datos
  96. //****************
  97.  
  98. void lecturapers(persona **p,int *dim)
  99. {    FILE *F;
  100.      int i;
  101.      *p=new (struct persona);
  102.      cout<<"Nombre(s):";
  103.      gets((*p)->nom);
  104.      cout<<"Apellido Paterno:";
  105.      gets((*p)->ap);
  106.      F = fopen("D:/trabajo/Agenda.dat","a+");
  107.      if(F==NULL)
  108.             {
  109.                printf(" No se puede abrir el archivo\n");
  110.                system("pause");
  111.                exit(1);
  112.             }
  113.      fwrite(&p,sizeof(*p),1,F);
  114.      printf("\n\n\tDOCENTE ARCHIVADO!!!");
  115.      printf("\n\n\t");
  116.      fclose(F);  
  117.      system("pause");
  118. }
  119.  
  120. void mostrarpers(persona *p,int dim)
  121.  
  122. {    FILE *F;
  123.      int i;
  124.      F = fopen("D:/trabajo/Agenda.dat","a++");
  125.      if(F==NULL)
  126.      {
  127.          printf("\n\tNo se puede abrir el archivo\n");
  128.          exit(1);
  129.      }
  130.      while(!feof(F))
  131.      {
  132.       printf("%s",p->nom);
  133.       printf("\t\t%s",p->ap);
  134.       cout<<"\n\n";
  135.       fread(&p,sizeof(*p),1,F);    
  136.      }
  137.      fclose(F);
  138.      system("pause");
  139.  }

gracias por su atencion.
  #2 (permalink)  
Antiguo 16/06/2009, 13:52
 
Fecha de Ingreso: diciembre-2008
Ubicación: Vigo, Spain
Mensajes: 141
Antigüedad: 15 años, 5 meses
Puntos: 12
Respuesta: Problemas con apuntadores y archivos

A simple vista, me doy cuenta que trabajas con estructuras y archivos binarios por supuesto, y a la hora de trabajar con archivos binarios se usa el RB,WB,AB+ ... etc, prueba acomodando eso a ver.
  #3 (permalink)  
Antiguo 16/06/2009, 17:25
 
Fecha de Ingreso: enero-2009
Mensajes: 53
Antigüedad: 15 años, 3 meses
Puntos: 1
Respuesta: Problemas con apuntadores y archivos

hola gracias por responder.

te refieres a esta parte fopen("D:/trabajo/Agenda.dat","a+");

bueno a mi me han enseñado lo basico de archivos pero con simples vectores . no con array dinamico como es lo que quiero hacer por eso dudo mucho que este bien lo que hize en estas partes

*p=new (struct persona);
F = fopen("D:/trabajo/Agenda.dat","a+");
fwrite(&p,sizeof(*p),1,F);
F = fopen("D:/trabajo/Agenda.dat","a++");
fread(&p,sizeof(*p),1,F);

si tuveras la amabilidad de analizarlo para saber cuales estan mal, yo trato de adelantarme en mis temas por eso que no entiendo muy bien esto.

gracias de antemano
  #4 (permalink)  
Antiguo 17/06/2009, 08:46
 
Fecha de Ingreso: diciembre-2008
Ubicación: Vigo, Spain
Mensajes: 141
Antigüedad: 15 años, 5 meses
Puntos: 12
Respuesta: Problemas con apuntadores y archivos

Cita:
Iniciado por xdunkelheitx Ver Mensaje
hola gracias por responder.

te refieres a esta parte fopen("D:/trabajo/Agenda.dat","a+");

bueno a mi me han enseñado lo basico de archivos pero con simples vectores . no con array dinamico como es lo que quiero hacer por eso dudo mucho que este bien lo que hize en estas partes

*p=new (struct persona);
F = fopen("D:/trabajo/Agenda.dat","a+");
fwrite(&p,sizeof(*p),1,F);
F = fopen("D:/trabajo/Agenda.dat","a++");
fread(&p,sizeof(*p),1,F);

si tuveras la amabilidad de analizarlo para saber cuales estan mal, yo trato de adelantarme en mis temas por eso que no entiendo muy bien esto.

gracias de antemano
Cuando abres/escribes archivos binarios, seria con la b.
F = fopen("D:/trabajo/Agenda.dat","ab+");

Y sobre esto:
F = fopen("D:/trabajo/Agenda.dat","a++");
Nunca vi eso de a++, los tipos que manejo son:

r ->leer archivo de texto por ejemplo
r+ ->leer y escribir archivo de texto por ejemplo
rb ->leer archivo binario
rb+ ->leer y escribir archivo binario
Igual para los otros tipos, w, a..


Y si te llega a dar problemas haciendo el fwrite o fread usando el sizeof(*p) intenta hacerlo con sizeof(struct persona).
  #5 (permalink)  
Antiguo 17/06/2009, 13:33
 
Fecha de Ingreso: enero-2009
Mensajes: 53
Antigüedad: 15 años, 3 meses
Puntos: 1
Respuesta: Problemas con apuntadores y archivos

gracias por responder, ya corregi sobre fread y fwrite pero aun me sigue botando basura, es decir bota el nombre pero tambien otras direcciones como el escritorio. y cuando quiero agregar otro dato lo reemplaza y cuando se cierra y quiero mostrar solo me sale una carita :S.

Nose que mas puede ser el problema para este algoritmo e estado intentando todo :S espero que puedan analizarlo para saber la causa.

gracias

Código codigo:
Ver original
  1. #include <iostream.h>
  2. #include <stdlib.h>
  3. #include <stdio.h>
  4. #include <conio.h>
  5. #include <conio.c>
  6. #include <string.h>
  7. #include <math.h>
  8. #include <malloc.h>
  9.  
  10. using std::iostream;
  11. using std::cout;
  12. using std::cin;
  13. using std::endl;
  14.  
  15.  
  16. struct fecha
  17. {
  18.    int dd;
  19.    int mm;
  20.    int aaaa;
  21. };
  22.  
  23. struct direccion
  24. {
  25.    char dir[50];
  26.    char disto[50];
  27.    char dpto[50];
  28.    char pais[50];
  29. };
  30.  
  31. struct persona
  32. {
  33.    char cod[8];
  34.    char ap[20];
  35.    char am[20];
  36.    char nom[50];
  37.    int sex;
  38.    fecha fnac;
  39.    direccion dir;
  40. };
  41. //declaracion de funciones
  42. //************************
  43. int menu();
  44. void lecturapers(persona **p,int *dim);
  45. void mostrarpers(persona *p,int dim);
  46.  
  47.  
  48. //Principal
  49. //*********
  50. int main()
  51. {   persona *a;
  52.     int opcion,n;
  53.     textbackground(15);
  54.     textcolor(0);
  55.     do{
  56.       system("cls");
  57.       opcion=menu();
  58.      
  59.       switch(opcion)
  60.             {
  61.              case 0: exit(1);
  62.              case 1: system("cls");
  63.                      lecturapers(&a,&n);
  64.                      break;
  65.              case 2: system("cls");
  66.                      mostrarpers(a,n);
  67.                      break;
  68.             }
  69.     }while(opcion);
  70.        
  71.        
  72.        
  73.        
  74.  
  75.       system("PAUSE");
  76.       return 0;
  77. }
  78.  
  79. //Menu de Opciones
  80. //****************
  81. int menu()
  82. {   int op;
  83.    
  84.     cout<<"\n \t\t\t   DIRECTORIO TELEFONICO\n";
  85.     cout<<"\t\t\t    ---------------------\n\n\n";
  86.     cout<<"\t\t\t   [1]Ingresar Datos\n";
  87.     cout<<"\t\t\t   [2]Mostrar Personas\n";
  88.     cout<<"\t\t\t   [0]Salir del directorio\n\n";
  89.     do{
  90.        cout<<"\n\t\t\t   Elige la opcion=";
  91.        cin>>op;
  92.     }while(op<0 && op>8);
  93.     return(op);
  94.  
  95. }
  96.  
  97. //Lectura de datos
  98. //****************
  99.  
  100. void lecturapers(persona **p,int *dim)
  101. {    FILE *F;
  102.      int i;
  103.     /* *p=new (struct persona); */
  104.      *p = (struct persona*) malloc (sizeof (struct persona));  
  105.        
  106.    
  107.      cout<<"Nombre(s):";
  108.      gets((*p)->nom);
  109.      cout<<"Apellido Paterno:";
  110.      gets((*p)->ap);
  111.      F = fopen("D:/trabajo/Agenda.dat","rb+");
  112.      if(F==NULL)
  113.             {
  114.                printf(" No se puede abrir el archivo\n");
  115.                system("pause");
  116.                exit(1);
  117.             }
  118.      fwrite(*p,sizeof(struct persona),1,F);
  119.      printf("\n\n\tDOCENTE ARCHIVADO!!!");
  120.      printf("\n\n\t");
  121.  
  122.      fclose(F);  
  123.      system("pause");
  124.      /*for(i=0;i<3;i++)
  125.      {cout<<"Nombre:";
  126.      gets((*p+i)->nom);}
  127.      *dim=3;
  128.      system("pause");*/
  129.    
  130.  
  131.      
  132. }
  133.  
  134. void mostrarpers(persona *p,int dim)
  135.  
  136. {    FILE *F;
  137.      int i;  
  138.      F = fopen("D:/trabajo/Agenda.dat","rb");
  139.      if(F==NULL)
  140.      {
  141.          printf("\n\tNo se puede abrir el archivo\n");
  142.          exit(1);
  143.      }
  144.      while(!feof(F))
  145.      {
  146.       printf("%s",p->nom);
  147.       printf("\t\t%s",p->ap);
  148.       cout<<"\n\n";
  149.       fread(p,sizeof(struct persona),1,F);
  150.          
  151.      }
  152.      fclose(F);
  153.      system("pause");
  154.  }
  #6 (permalink)  
Antiguo 17/06/2009, 14:46
 
Fecha de Ingreso: diciembre-2008
Ubicación: Vigo, Spain
Mensajes: 141
Antigüedad: 15 años, 5 meses
Puntos: 12
Respuesta: Problemas con apuntadores y archivos

Ok, el problema de cuando reemplaza es porque te explico:
Al abrir el archivo en modo rb+ el puntero del fichero se situa al principio del fichero, es decir, antes del primer registro, si revisas, no mueves ese puntero antes de usar el fwrite, y por eso te lo reemplaza, en cambio si abrieras el archivo en ab+ el puntero se situa al final del fichero si es que éste existe.

F = fopen("D:/trabajo/Agenda.dat","rb+");
if(F==NULL)
{
printf(" No se puede abrir el archivo\n");
system("pause");
exit(1);
}
fseek(F,0L,2); //te mueve el puntero al final del fichero
fwrite(*p,sizeof(struct persona),1,F);
printf("\n\n\tDOCENTE ARCHIVADO!!!");


----------------------------
Por otro lado, el problema de la visualización, está en que, al abrir el fichero, y acontinuación haces un while(!feof(F)), empiezas dentro del bucle, imprimiendo obviamente basura, ya que no hicistes ningun fread antes de la primera impresión, entonces quedaría así:

F = fopen("D:/trabajo/Agenda.dat","rb");
if(F==NULL)
{
printf("\n\tNo se puede abrir el archivo\n");
exit(1);
}
fread(p,sizeof(struct persona),1,F);
while(!feof(F))
{
printf("%s",p->nom);
printf("\t\t%s",p->ap);
cout<<"\n\n";
fread(p,sizeof(struct persona),1,F);

}
fclose(F);
system("pause");

Otra cosa que no recuerdo ahora, es que al usar puntero a puntero, no se si sigue necesitando o no, usar el & en fread/fwrite, pero puedes probar:

fread(p,sizeof(struct persona),1,F);
O
fread(&p,sizeof(struct persona),1,F);

Espero eso te solucione algún que otro problema.
  #7 (permalink)  
Antiguo 19/06/2009, 15:45
 
Fecha de Ingreso: enero-2009
Mensajes: 53
Antigüedad: 15 años, 3 meses
Puntos: 1
Respuesta: Problemas con apuntadores y archivos

muchas gracias por seguirme ayudando puse la funcion fseek e investigue sobre lo de fread y fwrite y logre que funcionara relativamente, es decir puedo ingresar un dato con la opcion 1 y luego verlo con la opcion 2 normalmente pero cuando cierro el programa y vuelvo a abrirlo y quiero verlo defrente con la opcion 2 me sale en blanco pero si abro el programa nuevamente y pongo la opcion 1 y luego opcion 2 se visualiza lo guardado anteriormente y lo nuevo. que error puede tener que no se visualize defrente el fichero

Código programa:
Ver original
  1. #include <iostream.h>
  2. #include <stdlib.h>
  3. #include <stdio.h>
  4. #include <conio.c>
  5.  
  6.  
  7.  
  8. using std::iostream;
  9. using std::cout;
  10. using std::cin;
  11. using std::endl;
  12.  
  13.  
  14. struct fecha
  15. {
  16.    int dd;
  17.    int mm;
  18.    int aaaa;
  19. };
  20.  
  21. struct direccion
  22. {
  23.    char dir[50];
  24.    char disto[50];
  25.    char dpto[50];
  26.    char pais[50];
  27. };
  28.  
  29. struct persona
  30. {
  31.    char cod[8];
  32.    char ap[20];
  33.    char am[20];
  34.    char nom[50];
  35.    int sex;
  36.    fecha fnac;
  37.    direccion dir;
  38. };
  39. //declaracion de funciones
  40. //************************
  41. int menu();
  42. void lecturapers(persona **p,int *dim);
  43. void mostrarpers(persona *p,int dim);
  44. unsigned short seekEnd(const FILE* F);
  45.  
  46. //Principal
  47. //*********
  48. int main()
  49. {   persona *a;
  50.     int opcion,n;
  51.     textbackground(15);
  52.     textcolor(0);
  53.     do{
  54.       system("cls");
  55.       opcion=menu();
  56.      
  57.       switch(opcion)
  58.             {
  59.              case 0: exit(1);
  60.              case 1: system("cls");
  61.                      lecturapers(&a,&n);
  62.                      break;
  63.              case 2: system("cls");
  64.                      mostrarpers(a,n);
  65.                      break;
  66.             }
  67.     }while(opcion);
  68.        
  69.        
  70.        
  71.        
  72.  
  73.       system("PAUSE");
  74.       return 0;
  75. }
  76.  
  77. //Menu de Opciones
  78. //****************
  79. int menu()
  80. {   int op;
  81.    
  82.     cout<<"\n \t\t\t   DIRECTORIO TELEFONICO\n";
  83.     cout<<"\t\t\t    ---------------------\n\n\n";
  84.     cout<<"\t\t\t   [1]Ingresar Datos\n";
  85.     cout<<"\t\t\t   [2]Mostrar Personas\n";
  86.     cout<<"\t\t\t   [0]Salir del directorio\n\n";
  87.     do{
  88.        cout<<"\n\t\t\t   Elige la opcion=";
  89.        cin>>op;
  90.     }while(op<0 && op>8);
  91.     return(op);
  92.  
  93. }
  94.  
  95. //Lectura de datos
  96. //****************
  97.  
  98. void lecturapers(persona **p,int *dim)
  99. {    FILE *F;
  100.      int i;
  101.  
  102.     *p = (struct persona*) malloc (sizeof (struct persona));  
  103.        
  104.    
  105.      cout<<"Nombre(s):";
  106.      gets((*p)->nom);
  107.      cout<<"Apellido Paterno:";
  108.      gets((*p)->ap);
  109.      F = fopen("D:/trabajo/Agenda.dat","ab+");
  110.      if(F==NULL)
  111.             {
  112.                printf(" No se puede abrir el archivo\n");
  113.                system("pause");
  114.                exit(1);
  115.             }
  116.      fseek(F,0L,2);
  117.      fwrite(*p,sizeof(struct persona),1,F);
  118.      printf("\n\n\tDOCENTE ARCHIVADO!!!");
  119.      printf("\n\n\t");
  120.  
  121.      fclose(F);  
  122.      system("pause");
  123.  
  124.      
  125. }
  126.  
  127. void mostrarpers(persona *p,int dim)
  128.  
  129. {    FILE *F;
  130.      int i;  
  131.      F = fopen("D:/trabajo/Agenda.dat","rb");
  132.      if(F==NULL)
  133.      {
  134.          printf("\n\tNo se puede abrir el archivo\n");
  135.          system("pause");
  136.          exit(1);
  137.      }
  138.  
  139.      fread(p,sizeof(struct persona),1,F);
  140.      while(!feof(F))
  141.      {
  142.       printf("%s",p->nom);
  143.       printf("\t\t%s",p->ap);
  144.       cout<<"\n\n";
  145.      fread(p,sizeof(struct persona),1,F);
  146.          
  147.      }
  148.      fclose(F);
  149.      system("pause");
  150.  
  151. }

espero me puedas seguir ayudando ya falta poco para que tenga todo listo. gracias denuevo
  #8 (permalink)  
Antiguo 19/06/2009, 17:52
 
Fecha de Ingreso: diciembre-2008
Ubicación: Vigo, Spain
Mensajes: 141
Antigüedad: 15 años, 5 meses
Puntos: 12
Respuesta: Problemas con apuntadores y archivos

Hice esto y ya va el visualizar directamente:

Código:
void mostrarpers(persona *p,int dim)
 
{    FILE *F;
     persona aux;
     int i;  
     F = fopen("C:/agenda","rb");
     if(F==NULL)
     {
         printf("\n\tNo se puede abrir el archivo\n");
         system("pause");
         exit(1); 
     }
  
     fread(&aux,sizeof(struct persona),1,F); 
     while(!feof(F))
     {
      printf("%s",aux.nom);
      printf("\t\t%s",aux.ap);
      cout<<"\n\n";
     fread(&aux,sizeof(struct persona),1,F); 
          
     }
     fclose(F);
     system("pause");
  
}
Si en la funcion visualizar vuelves a abrir el fichero, que es lo normal y lógico, no hace falta que le mandes las variables que le mandas, yo lo que haría es declararlas localmente en la función, o globalmente de una vez, y de esta manera fue que yo aprendí, no le veo la necesidad a los punteros para trabajar con ficheros :P, ya los usarás bastante en listas, pilas, colas, arboles.. etc xD.
  #9 (permalink)  
Antiguo 21/06/2009, 08:56
 
Fecha de Ingreso: enero-2009
Mensajes: 53
Antigüedad: 15 años, 3 meses
Puntos: 1
Respuesta: Problemas con apuntadores y archivos

muchas gracias por la ayuda, lo quiero con apuntadores porque para mi profe es mas nota .

denuevo muchas gracias
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 11:08.