Test Foro de elhacker.net SMF 2.1

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.

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


struct registro{

    char nombre[10];
    int edad;

};

int main(){

     int n,i;
     struct registro usuario[10];

    FILE *archivo;


    archivo=fopen("usuarios.txt","a+");


    printf("Cuantos usuarios desea ingresar:");
    scanf("%d",&n);

    for(i=0;i<n;i++){

    printf("Nombre:");
    scanf("%s",&usuario[i].nombre);
    fprintf(archivo,"%s ",usuario[i].nombre);

    printf("Edad:");
    scanf("%d",&usuario[i].edad);
    fprintf(archivo,"%d ",usuario[i].edad);
    fprintf(archivo,"\n");

    }

  fclose(archivo);
system("cls");

   archivo=fopen("usuarios.txt","r");
fscanf(archivo,"%s %d",usuario[i].nombre,usuario[i].edad);

   while(!feof(archivo)){



   fscanf(archivo,"%s%d",usuario[i].nombre,usuario[i].edad);



   printf("Nombre:%s\n",usuario[i].nombre);
   printf("Edad:%d\n",usuario[i].edad);


   }

  fclose(archivo);


}
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!!



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


struct registro{

    char nombre[10];
    int edad;

};

int main(int argc, char** argv)
{

     int n,i;
     struct registro usuario[10];

    FILE *archivo;


    archivo=fopen("usuarios.txt","a+");
    printf("Cuantos usuarios desea ingresar:");
    scanf("%d",&n);

    for(i=0;i<n;i++)
{

printf("Nombre:");
scanf("%s",usuario[i].nombre);
fprintf(archivo,"%s ",usuario[i].nombre);

printf("Edad:");
scanf("%d", &usuario[i].edad);
fprintf(archivo,"%d ",usuario[i].edad);
fprintf(archivo,"\n");

    }
fclose(archivo);
archivo=fopen("usuarios.txt","r");
fscanf(archivo,"%s %d",usuario[i].nombre,&usuario[i].edad);

while(!feof(archivo))
{

fscanf(archivo,"%s %d",usuario[i].nombre,&usuario[i].edad);
printf("Nombre:%s\n",usuario[i].nombre);
printf("Edad:%d\n",usuario[i].edad);

}

  fclose(archivo);

return 0;
}

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


while(!feof(archivo))
{
  printf("Nombre:%s\n", usuario[i].nombre);
printf("Edad:%d\n", usuario[i].edad);
fscanf(archivo, "%s %d",usuario[i].nombre, &usuario[i].edad);


}




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:


#include <stdio.h>

int main()
{

char text[100];

printf("Ingrese cadena: ");
fgets(text, 100, stdin);

printf("%s",text);

return 0;
}



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:




        fgets (buf,121,archivo); pasa a la siguiente linea y la copia en el buffer
while(!feof(archivo))
{

                puts(buff); //imprime lo que haya en el bufer 
            fgets (buf,121,archivo); // pasa a la siguiente linea y la copia en el buffer

}



otra manera podria ser.


         
while( fgets (buf,121,archivo))
{

                puts(buff); //imprime lo que haya en el bufer 
           
}




Salduos