Autor
|
Tema: sustituir scanf (Leído 7,119 veces)
|
m@o_614
Desconectado
Mensajes: 389
|
Saludos Tengo el siguiente codigo en el que le ingresas datos a una estructura x, el programa compila correctamente pero tengo una duda, tengo entendido que cuando alternas una funcion como fgets() y scanf() te da problemas, y para esto le puse un ciclo while con un getchar(). Pero queria saber si podia sustituir el scanf por otra funcion que no me provoque basura en el buffer, para asi no tener que ponerle el while(getchar()!= '\n') #include <stdio.h> #include <stdlib.h> #define TAM 20 #define MAX 10 typedef struct datos { char nombre[TAM]; int edad; char ciudad_residencia[TAM]; }Persona; void entrada(Persona *p); int main() { Persona p; int i; for(i = 0;i < 10;i++) entrada(&p); return 0; } void entrada(Persona *p) { fgets(p ->nombre ,TAM ,stdin ); printf("Dame ciudad de residencia:\n"); fgets(p ->ciudad_residencia ,TAM ,stdin ); }
gracias
|
|
|
En línea
|
|
|
|
Eternal Idol
Kernel coder
Moderador
Desconectado
Mensajes: 5.966
Israel nunca torturó niños, ni lo volverá a hacer.
|
|
|
|
En línea
|
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste. Juan Domingo Perón
|
|
|
m@o_614
Desconectado
Mensajes: 389
|
Saludos Eternal Idol, por lo que he entendido la funcion sscanf obtiene la entrada de un arreglo y no de un stream, entonces si yo quisiera ponerle un stdin para indicarle que va a tomar la entrada de lo que le ingrese por el teclado me va a dar error, que puedo hacer en este caso?
de antemano gracias
|
|
|
En línea
|
|
|
|
Eternal Idol
Kernel coder
Moderador
Desconectado
Mensajes: 5.966
Israel nunca torturó niños, ni lo volverá a hacer.
|
Para eso se llama primero a fgets con stdin, fijate en el enlace que deje antes.
|
|
|
En línea
|
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste. Juan Domingo Perón
|
|
|
m@o_614
Desconectado
Mensajes: 389
|
muchas gracias Eternal Idol ya cheque el enlace que dejaste, y ya pude hacer el codigo que me tiene que ingresar datos de una estructura en un archivo, cerrarlo y despues que me imprima en pantalla los datos que se habian guardado, pero tengo otra duda, cada vez que utilizas fgets() es necesario quitarle el salto de linea '\n', se recomienda hacer eso?? y tambien en el sscanf si quiero que lo que me ingrese sea un entero no se desperdicia espacio en el array que le puse asi: void entrada(Persona *p) { char cad[10]; fgets(p ->nombre ,MAX ,stdin ); fgets(cad ,10,stdin );// aqui tiene una array de 10 elementos pero solo ocupo un int }
aqui esta el codigo completo #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX 20 /* Crear un “struct” que almacene los siguientes datos de una persona: nombre, edad, ciudad de residencia. Pedir al usuario esos datos de una persona y guardarlos en un fichero llamado “gente.dat”, cerrar el fichero, volverlo a abrir para lectura y mostrar los datos que se habían guardado. */ typedef struct datos { char nombre[MAX]; int edad; char ciudad_residencia[MAX]; }Persona; void entrada(Persona *p); void mostrar(FILE *ap); int main() { FILE *fd,*ap; Persona p; if((fd = fopen("F:\\gente.txt","w"))!= NULL ) { entrada(&p); fprintf(fd ,"%s\n",p. ciudad_residencia); if((ap = fopen("F:\\gente.txt","r"))!= NULL ); mostrar(ap); } else printf("No se pudo crear archivo"); return 0; } void entrada(Persona *p) { char cad[10]; fgets(p ->nombre ,MAX ,stdin ); printf("Dame ciudad de residencia:\n"); fgets(p ->ciudad_residencia ,MAX ,stdin ); } void mostrar(FILE *ap) { int car; while((car = fgetc(ap ))!= EOF ) }
|
|
|
En línea
|
|
|
|
Eternal Idol
Kernel coder
Moderador
Desconectado
Mensajes: 5.966
Israel nunca torturó niños, ni lo volverá a hacer.
|
muchas gracias Eternal Idol ya cheque el enlace que dejaste, y ya pude hacer el codigo que me tiene que ingresar datos de una estructura en un archivo, cerrarlo y despues que me imprima en pantalla los datos que se habian guardado, pero tengo otra duda, cada vez que utilizas fgets() es necesario quitarle el salto de linea '\n', se recomienda hacer eso?? y tambien en el sscanf si quiero que lo que me ingrese sea un entero no se desperdicia espacio en el array que le puse asi: De nadas. Partiendo de la base de que esta el salto de linea (dependera del tamaño que le pases a fgets y lo que escriba el usuario) si lo que queres guardar no es una linea en si misma entonces tiene sentido sacarlo. cad solo tiene como ambito entrada, cuando la funcion retorna esos caracteres en la pila vuelven a estar disponibles.
|
|
|
En línea
|
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste. Juan Domingo Perón
|
|
|
m@o_614
Desconectado
Mensajes: 389
|
una ultima pregunta, si le quiero hacer una modificacion al codigo y en vez de que me guarde los datos de la estructura en el archivo con fprintf quiero que lo haga con fwrite, ya no funciona como lo hacia con fprintf ahora me imprime basura, por que sucede esto?? #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX 20 /* Crear un “struct” que almacene los siguientes datos de una persona: nombre, edad, ciudad de residencia. Pedir al usuario esos datos de una persona y guardarlos en un fichero llamado “gente.dat”, cerrar el fichero, volverlo a abrir para lectura y mostrar los datos que se habían guardado. */ typedef struct datos { char nombre[MAX]; int edad; char ciudad_residencia[MAX]; }Persona; void entrada(Persona *p); void mostrar(FILE *ap); int main() { FILE *fd,*ap; Persona p; if((fd = fopen("F:\\gente.txt","w"))!= NULL ) { entrada(&p); fwrite(&p ,sizeof(Persona ),1,fd ); if((ap = fopen("F:\\gente.txt","r"))!= NULL ); mostrar(ap); } else printf("No se pudo crear archivo"); return 0; } void entrada(Persona *p) { char cad[10]; fgets(p ->nombre ,MAX ,stdin ); printf("Dame ciudad de residencia:\n"); fgets(p ->ciudad_residencia ,MAX ,stdin ); } void mostrar(FILE *ap) { int car; while((car = fgetc(ap ))!= EOF ) }
|
|
|
En línea
|
|
|
|
Eternal Idol
Kernel coder
Moderador
Desconectado
Mensajes: 5.966
Israel nunca torturó niños, ni lo volverá a hacer.
|
fwrite hace exactamente lo que vos le decis, ahi estas pasandole sizeof(Persona) como tamaño y eso incluye TODOS los bytes de las cadenas, aunque estas esten terminadas antes ...
|
|
|
En línea
|
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste. Juan Domingo Perón
|
|
|
m@o_614
Desconectado
Mensajes: 389
|
ya entendi en donde estaba el error, sizeof(Persona) es igual a 44 porque toma las elementos de la struct completos, otra duda, estaba leyendo en una pagina de internet y me decia que cuando estoy guardando estructuras en un archivo de texto tengo que hacerlo campo por campo, o sea que tendria que usar 3 fwrites() y cuando estoy abriendo el archivo en binario puedo hacerlo todo en un solo paso, si es asi o no?
gracias de nuevo
|
|
|
En línea
|
|
|
|
Eternal Idol
Kernel coder
Moderador
Desconectado
Mensajes: 5.966
Israel nunca torturó niños, ni lo volverá a hacer.
|
Si inicializas todo a 0 (asi por ejemplo se sabe donde termina la cadena) y no te importa escribir mas bytes de los necesarios podes escribir la estructura entera.
|
|
|
En línea
|
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste. Juan Domingo Perón
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Duda con scanf
Programación C/C++
|
Caster
|
3
|
4,217
|
29 Septiembre 2012, 13:01 pm
por Caster
|
|
|
Pregunta de C scanf
Programación C/C++
|
g0rg3d3l4s3lv4
|
3
|
2,733
|
15 Marzo 2013, 04:21 am
por g0rg3d3l4s3lv4
|
|
|
scanf y gets
« 1 2 »
Programación C/C++
|
m@o_614
|
16
|
8,391
|
21 Julio 2013, 19:29 pm
por rir3760
|
|
|
[C] Comparación entre el gets y el scanf
« 1 2 »
Programación C/C++
|
niñoAtómico
|
12
|
6,367
|
12 Octubre 2013, 23:24 pm
por vangodp
|
|
|
Ayuda con el scanf n el for
Programación C/C++
|
Jorge LuissxX
|
2
|
1,666
|
18 Mayo 2019, 02:07 am
por K-YreX
|
|