Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: javahat en 20 Mayo 2010, 22:27 pm



Título: problema lectura de archivo
Publicado por: javahat en 20 Mayo 2010, 22:27 pm
Hola tengo el sgte código, ingreso un par de datos por ejemplo nombre y edad:

raul 34
juan 12

...y después necesito leer los datos del archivo pero no me los muestra en pantalla arroja un error.

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4.  
  5. struct registro{
  6.  
  7.    char nombre[10];
  8.    int edad;
  9.  
  10. };
  11.  
  12. int main(){
  13.  
  14.     int n,i;
  15.     struct registro usuario[10];
  16.  
  17.    FILE *archivo;
  18.  
  19.  
  20.    archivo=fopen("usuarios.txt","a+");
  21.  
  22.  
  23.    printf("Cuantos usuarios desea ingresar:");
  24.    scanf("%d",&n);
  25.  
  26.    for(i=0;i<n;i++){
  27.  
  28.    printf("Nombre:");
  29.    scanf("%s",&usuario[i].nombre);
  30.    fprintf(archivo,"%s ",usuario[i].nombre);
  31.  
  32.    printf("Edad:");
  33.    scanf("%d",&usuario[i].edad);
  34.    fprintf(archivo,"%d ",usuario[i].edad);
  35.    fprintf(archivo,"\n");
  36.  
  37.    }
  38.  
  39.  fclose(archivo);
  40. system("cls");
  41.  
  42.   archivo=fopen("usuarios.txt","r");
  43. fscanf(archivo,"%s %d",usuario[i].nombre,usuario[i].edad);
  44.  
  45.   while(!feof(archivo)){
  46.  
  47.  
  48.  
  49.   fscanf(archivo,"%s%d",usuario[i].nombre,usuario[i].edad);
  50.  
  51.  
  52.  
  53.   printf("Nombre:%s\n",usuario[i].nombre);
  54.   printf("Edad:%d\n",usuario[i].edad);
  55.  
  56.  
  57.   }
  58.  
  59.  fclose(archivo);
  60.  
  61.  
  62. }


Título: Re: problema lectura de archivo
Publicado por: nicolasblues86 en 20 Mayo 2010, 22:50 pm


ya anda joya el problema era con los scanf cuando son cadenas los datos a tratar el '&' no se pone en cambio cuando es un entero si se tiene que agregar el '&'.. el programa ahora andaría aunque  los scanf te van a traer problemas, mejor usa fgets con stdin.. saludos!!


Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4.  
  5. struct registro{
  6.  
  7.    char nombre[10];
  8.    int edad;
  9.  
  10. };
  11.  
  12. int main(int argc, char** argv)
  13. {
  14.  
  15.     int n,i;
  16.     struct registro usuario[10];
  17.  
  18.    FILE *archivo;
  19.  
  20.  
  21.    archivo=fopen("usuarios.txt","a+");
  22.    printf("Cuantos usuarios desea ingresar:");
  23.    scanf("%d",&n);
  24.  
  25.    for(i=0;i<n;i++)
  26. {
  27.  
  28. printf("Nombre:");
  29. scanf("%s",usuario[i].nombre);
  30. fprintf(archivo,"%s ",usuario[i].nombre);
  31.  
  32. printf("Edad:");
  33. scanf("%d", &usuario[i].edad);
  34. fprintf(archivo,"%d ",usuario[i].edad);
  35. fprintf(archivo,"\n");
  36.  
  37.    }
  38. fclose(archivo);
  39. archivo=fopen("usuarios.txt","r");
  40. fscanf(archivo,"%s %d",usuario[i].nombre,&usuario[i].edad);
  41.  
  42. while(!feof(archivo))
  43. {
  44.  
  45. fscanf(archivo,"%s %d",usuario[i].nombre,&usuario[i].edad);
  46. printf("Nombre:%s\n",usuario[i].nombre);
  47. printf("Edad:%d\n",usuario[i].edad);
  48.  
  49. }
  50.  
  51.  fclose(archivo);
  52.  
  53. return 0;
  54. }
  55.  


Título: Re: problema lectura de archivo
Publicado por: javahat en 20 Mayo 2010, 22:57 pm
Con los "&"  ingreso bien los datos al archivo pero al mostrarlos se repite el segundo dato 2 veces ejemplo:

Ingresar:
raul 12
pepe 34

Mostrar:
pepe 34
pepe 34

tengo que hacerlo con fscanf ....


Título: Re: problema lectura de archivo
Publicado por: nicolasblues86 en 20 Mayo 2010, 23:27 pm
Claro el problema es que cuando ya se llega a fin de archivo todavía estamos dentro del while ya que feof no mueve el puntero sino que lo hace fscanf por eso cuando llega a fin de archivo todavia tiene que imprimir lo que contiene los printf
lo unico que deberias hacer es cambiar el orden de los printf ponelos arriba del fscanf y si no me equivoco ya estaria solucionado :D

Código
  1. while(!feof(archivo))
  2. {
  3.   printf("Nombre:%s\n", usuario[i].nombre);
  4. printf("Edad:%d\n", usuario[i].edad);
  5. fscanf(archivo, "%s %d",usuario[i].nombre, &usuario[i].edad);
  6.  
  7.  
  8. }
  9.  



Saludos !!!


Título: Re: problema lectura de archivo
Publicado por: javahat en 21 Mayo 2010, 05:21 am
Gracias me sirvió mucho tu ayuda pero para tenerlo en cuenta como puedo hacerlo con fgets? me podrías explicar, estoy iniciando en esto de los archivos y estoy un poco complicado.


Título: Re: problema lectura de archivo
Publicado por: AckeR en 21 Mayo 2010, 05:50 am
http://www.cplusplus.com/reference/clibrary/cstdio/fgets/ (http://www.cplusplus.com/reference/clibrary/cstdio/fgets/)
http://en.wikipedia.org/wiki/Fgets (http://en.wikipedia.org/wiki/Fgets)

y creo que no está demas leer esto:

http://foro.elhacker.net/programacion_cc/lo_que_no_hay_que_hacer_en_cc_nivel_basico-t277729.0.html (http://foro.elhacker.net/programacion_cc/lo_que_no_hay_que_hacer_en_cc_nivel_basico-t277729.0.html)


Ahí puedes ver como se utiliza fgets.

char * fgets ( char * str, int num, FILE * stream );

por ej:

Código
  1. #include <stdio.h>
  2.  
  3. int main()
  4. {
  5.  
  6. char text[100];
  7.  
  8. printf("Ingrese cadena: ");
  9. fgets(text, 100, stdin);
  10.  
  11. printf("%s",text);
  12.  
  13. return 0;
  14. }
  15.  
  16.  

suerte!



Título: Re: problema lectura de archivo
Publicado por: nicolasblues86 en 22 Mayo 2010, 01:04 am
por las dudas que te hallas referido a fgets para tratamiento de archivo seria muy parecido a como lo plantea AckeR sol oque suplantas stdin por el puntero FILE ejemplo:


Código
  1.  
  2.        fgets (buf,121,archivo); pasa a la siguiente linea y la copia en el buffer
  3. while(!feof(archivo))
  4. {
  5.  
  6.                puts(buff); //imprime lo que haya en el bufer  
  7.             fgets (buf,121,archivo); // pasa a la siguiente linea y la copia en el buffer
  8.  
  9. }
  10.  
  11.  

otra manera podria ser.


Código
  1.  
  2. while( fgets (buf,121,archivo))
  3. {
  4.  
  5.                puts(buff); //imprime lo que haya en el bufer  
  6.  
  7. }
  8.  
  9.  


Salduos