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);
}
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;
}
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 ....
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 !!!
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.
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!
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