problema lectura de archivo

Iniciado por javahat, 20 Mayo 2010, 22:27 PM

0 Miembros y 1 Visitante están viendo este tema.

javahat

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);


}

nicolasblues86



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

Solamente hay 10 clases de personas en el mundo los que saben leer binario y los que no

javahat

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 ....

nicolasblues86

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 !!!
Solamente hay 10 clases de personas en el mundo los que saben leer binario y los que no

javahat

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.

AckeR

http://www.cplusplus.com/reference/clibrary/cstdio/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


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!


...DaR LaS GraCiaS No CuestA NadA...

nicolasblues86

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
Solamente hay 10 clases de personas en el mundo los que saben leer binario y los que no