| Ver tema anterior :: Ver siguiente tema | | Autor | Mensaje |
|---|
K1LL3RDO6
Registrado: 03 Abr 2005 Mensajes: 3
| Publicado: 03/11/2007 8:13 pm | | | Título: fgets y estructura |
| Hola, soy nuevo en esto de la programación y tengo una duda.
Estoy tratando de usar la función fgets para recibir un string, mi problema es que al ejecutar el programa, se salta la lectura del string.
Esto solo me pasa si pongo las variables dentro de una estructura, pues si no lo hago no hay problemas.
Tengo que hacerlo asi por que nos estan enseñando eso ahora.
Esto lo estoy compilando en linux.
| Código: |
#include <stdio.h> #include <stdlib.h> #include <string.h> //#include <conio.h>
void menu(); void ingresar(); void imprimir(); void mayor18(); void buscar_nombre();
struct registro {
char nombre[20], apellido[20]; int edad; char domicilio[25];
};
struct registro reg; FILE *a; char ok;
int main() {
// clrscr(); // ingresar(); // imprimir(); // mayor18(); // buscar_nombre(); menu(); return 0; }
void menu() {
short opcion;
do {
system("clear"); printf("MENU\n\n"); printf("1. Ingresar datos\n"); printf("2. Imprimir registros\n"); printf("3. Mayores de 18\n"); printf("4. Buscar por nombre\n"); printf("0. Salir\n"); printf("Ingresa opcion: "); scanf("%d", &opcion);
switch (opcion) {
case 0: break;
case 1: ingresar(); break;
case 2: imprimir(); break;
case 3: mayor18(); break;
case 4: buscar_nombre(); break;
default: printf("Opcion no valida\n"); break;
}
} while ( opcion != 0); }
void ingresar() {
a = fopen("datos.dat", "w");
if (a == NULL) {
printf("No se puede crear\n"); // getch(); } else {
do {
// clrscr(); printf("\nIngreso datos\n"); printf("Nombre: "); scanf("%s", ®.nombre); printf("Apellido: "); scanf("%s", ®.apellido); printf("Edad: "); scanf("%d", ®.edad); printf("Domicilio: "); fgets(reg.domicilio, 25, a); //scanf("%s", ®.domicilio); //getline(reg.domicilio, 25); /* toma los espacios tb*/ fwrite(®, sizeof(reg), 1, a); printf("Registro grabado.. Ingresa otro s/n: "); scanf("%s", &ok);
} while (ok=='s'); } fclose(a); }
void imprimir() {
a = fopen("datos.dat", "r");
if (a == NULL) {
printf("\nError al abrir el archivo"); // getch(); } else {
do {
fread(®, sizeof(reg), 1, a); if (feof(a)) { printf("fin de lectura...\n\n"); // getch(); } else {
printf("\n\nNombre: %s\n", reg.nombre); printf("Apellido: %s\n", reg.apellido); printf("Edad: %d\n", reg.edad); printf("Domicilio: %s\n", reg.domicilio); } } while (!feof(a)); }
fclose(a); system("sleep 10"); /* realiza un sleep de 10 seg */
}
void mayor18() {
short cont = 0;
/* Abre el archivo */ // a = fopen("datos.dat", "r");
// if (a == NULL) {
if ( (a = fopen("datos.dat", "r") ) == NULL ) {
printf("Error a abrir archivo\n"); // getch(); } else {
do {
fread(®, sizeof(reg), 1, a);
if ( feof(a)) {
printf("fin de lectura\n"); } else {
if (reg.edad > 18) {
if (cont == 0)
printf("PERSONAS MAYORES de 18\n\n");
printf("Nombre: %s\n", reg.nombre); printf("Apellido: %s\n", reg.apellido); printf("Edad: %d\n", reg.edad); printf("Domicilio: %s\n\n", reg.domicilio); cont = 1; } } } while (!feof(a)); }
fclose(a); // getch(); }
void buscar_nombre() {
char nombre[20]; short aux = 0;
printf("BUSQUEDA PERSONA POR NOMBRE\n\n"); printf("Nombre: "); scanf("%s", &nombre);
if ( (a = fopen("datos.dat", "r") ) == NULL ) {
printf("Error a abrir archivo\n"); } else {
do {
fread(®, sizeof(reg), 1, a);
if ( feof(a))
printf("fin de lectura\n");
else { if ( strcmp(nombre, reg.nombre) == 0) {
if ( aux == 0)
printf("Se encontro a:\n\n");
printf("Nombre: %s %s\n", reg.nombre, reg.apellido); printf("Edad: %d\n", reg.edad); printf("Domicilio: %s\n", reg.domicilio); aux = 1; } }
} while (!feof(a)); }
fclose(a); }
|
Al ejecutarse se ve asi
| Código: | MENU
1. Ingresar datos 2. Imprimir registros 3. Mayores de 18 4. Buscar por nombre 0. Salir Ingresa opcion: 1
Ingreso datos Nombre: juan Apellido: perez Edad: 30 Domicilio: Registro grabado.. Ingresa otro s/n:
|
Como se puede ver, después de "Domicilio" me dice inmediatamente que el registro está grabado, y no me permite ingresar el domicilio de la persona.
Agradeceria si alguien me puede ayudar, darme alguna pista de por qué está mal por favor. |
| | Volver arriba | |  | rir3760

Registrado: 01 Oct 2004 Mensajes: 3777 Ubicación: Mexico
| Publicado: 04/11/2007 6:26 am | | | Título: |
| El error es uno muy comun causado por el uso intercalado de la funcion scanf con otras funciones como gets/fgets/etc.
En esta parte de tu programa:
| Código: | printf("Edad: "); scanf("%d", ®.edad);
printf("Domicilio: "); fgets(reg.domicilio, 25, a); |
La funcion scanf lee el numero de la entrada estandar pero no procesa el espacio blanco despues de este (incluyendo el avance de linea o '\n').
Supongamos que al presentarse la peticion de la edad se teclea "123" seguido de {ENTER}, en este caso el bufer de la entrada estandar contiene: 1, 2, 3, {ENTER} Los tres primeros caracteres son procesados por scanf para formar el numero 123 pero (este es el gran problema) el avance de linea se queda en el bufer.
La siguiente funcion (fgets) trata de leer una linea y se encuentra con el remanente de scanf: {ENTER} Ese avance de linea fgets lo toma como una linea en blanco y es la causa de que el programa no te permita introducir el domicilio.
Para evitar todo esto basta con eliminar los caracteres restantes de la linea despues de la llamada a scanf:
| Código: | printf("Edad: "); scanf("%d", ®.edad); /* eliminar resto de la linea*/ { int ch;
while ((ch = getchar()) != EOF && ch != '\n') ; }
printf("Domicilio: "); fgets(reg.domicilio, 25, a); |
Un saludo _________________ The capacity to learn is a gift; The ability to learn is a skill; The willingness to learn is a choice. -- Rebec of Ginaz |
| | Volver arriba | |  | K1LL3RDO6
Registrado: 03 Abr 2005 Mensajes: 3
| Publicado: 04/11/2007 5:13 pm | | | Título: |
| | rir3760 escribió: | El error es uno muy comun causado por el uso intercalado de la funcion scanf con otras funciones como gets/fgets/etc.
En esta parte de tu programa:
| Código: | printf("Edad: "); scanf("%d", ®.edad);
printf("Domicilio: "); fgets(reg.domicilio, 25, a); |
La funcion scanf lee el numero de la entrada estandar pero no procesa el espacio blanco despues de este (incluyendo el avance de linea o '\n').
Supongamos que al presentarse la peticion de la edad se teclea "123" seguido de {ENTER}, en este caso el bufer de la entrada estandar contiene: 1, 2, 3, {ENTER} Los tres primeros caracteres son procesados por scanf para formar el numero 123 pero (este es el gran problema) el avance de linea se queda en el bufer.
La siguiente funcion (fgets) trata de leer una linea y se encuentra con el remanente de scanf: {ENTER} Ese avance de linea fgets lo toma como una linea en blanco y es la causa de que el programa no te permita introducir el domicilio.
Para evitar todo esto basta con eliminar los caracteres restantes de la linea despues de la llamada a scanf:
| Código: | printf("Edad: "); scanf("%d", ®.edad); /* eliminar resto de la linea*/ { int ch;
while ((ch = getchar()) != EOF && ch != '\n') ; }
printf("Domicilio: "); fgets(reg.domicilio, 25, a); |
Un saludo |
Hola, escribi lo que pusiste, pero tampoco me permite poder ingresar la dirección, compilo, ejecuto y se salta tambien poder ingresar el domicilio.
saludos |
| | Volver arriba | |  | | daltomi
Registrado: 28 Abr 2007 Mensajes: 120 Ubicación: Argentina
| Publicado: 04/11/2007 6:40 pm | | | Título: |
| Hola. En la función ingresar existe un error: Creas un archivo de sólo escritura y luego utilizas la función fgets para leer el archivo, es decir, debes reemplazar fgets por scanf,o mejor dicho, comenta fgets y quita el formato de comentario al scanf que ya existe.
Saludos. |
| | Volver arriba | |  | Diabliyo
Registrado: 14 Abr 2004 Mensajes: 317 Ubicación: En la Luna
| Publicado: 04/11/2007 7:38 pm | | | Título: |
| Limpia el buffer...
| Código: | //para windows. fflush(stdin);
//para linux while( getch()!='\n' ); |
_________________
|
| | Volver arriba | |  | mamntc02
Registrado: 30 Abr 2007 Mensajes: 266
| Publicado: 05/11/2007 4:38 am | | | Título: |
| Hola,
Volvemos a un error recurrente. no tiene por qué funcionar (ni en Linux, ni en Windows ni en ninguna plataforma). No hay ninguna función en el standard q vacie los buffer de entrada, fflush sólo funciona (o sólo es obligatorio q funcione) para buffers de salida. Puede q el compilador igualmente implemente la función para los buffers de entrada, pero nadie le obliga y lo más probable es q no te funcione. La solución es la q comenta rir3760
Saludos. |
| | Volver arriba | |  | | K1LL3RDO6
Registrado: 03 Abr 2005 Mensajes: 3
| Publicado: 05/11/2007 9:11 am | | | Título: |
| Hice lo que me dijeron, estoy probando en windows y no me resulta, aca le saque un screenshot al turbo c, ejecutando el programita.
No me funciona en windows o linux, no se si falto algo =\
| Código: | #include <stdio.h> #include <stdlib.h> #include <string.h> #include <conio.h>
void menu(); void ingresar(); void imprimir(); void mayor18(); void buscar_nombre();
struct registro {
char nombre[20], apellido[20]; int edad; char domicilio[25];
};
struct registro reg; FILE *a; char ok;
int main() {
menu(); return 0; }
void menu() {
short opcion;
do {
clrscr(); printf("MENU\n\n"); printf("1. Ingresar datos\n"); printf("2. Imprimir registros\n"); printf("3. Mayores de 18\n"); printf("4. Buscar por nombre\n"); printf("0. Salir\n\n"); printf("Ingresa opcion: "); scanf("%d", &opcion);
switch (opcion) {
case 0: break;
case 1: ingresar(); break;
case 2: imprimir(); break;
case 3: mayor18(); break;
case 4: buscar_nombre(); break;
default: printf("Opcion no valida\n"); break;
}
} while ( opcion != 0); }
void ingresar() {
a = fopen("datos.dat", "w");
if (a == NULL) {
printf("No se puede crear\n"); } else {
do {
printf("\nIngreso datos\n"); printf("Nombre: "); scanf("%s", ®.nombre); printf("Apellido: "); scanf("%s", ®.apellido); printf("Edad: "); scanf("%d", ®.edad); /* eliminar resto de la linea */ {
int ch;
while ((ch = getchar()) != EOF && ch != '\n') ;
} printf("Domicilio: "); fgets(reg.domicilio, 25, a); //scanf("%s", ®.domicilio); //cin.getline(reg.domicilio, 25); /* toma los espacios tb*/ fwrite(®, sizeof(reg), 1, a); printf("Registro grabado.. Ingresa otro s/n: "); scanf("%s", &ok);
} while (ok=='s'); } fclose(a); getch(); }
void imprimir() {
a = fopen("datos.dat", "r");
if (a == NULL) {
printf("\nError al abrir el archivo");
} else {
do {
fread(®, sizeof(reg), 1, a); if (feof(a)) { printf("fin de lectura...\n\n");
} else {
printf("\n\nNombre: %s\n", reg.nombre); printf("Apellido: %s\n", reg.apellido); printf("Edad: %d\n", reg.edad); printf("Domicilio: %s\n", reg.domicilio);
} } while (!feof(a)); }
fclose(a); // system("sleep 10"); /* realiza un sleep de 10 seg */ getch();
}
void mayor18() {
short cont = 0;
if ( (a = fopen("datos.dat", "r") ) == NULL ) {
printf("Error a abrir archivo\n");
} else {
do {
fread(®, sizeof(reg), 1, a);
if ( feof(a)) {
printf("fin de lectura\n"); } else {
if (reg.edad > 18) {
if (cont == 0)
printf("PERSONAS MAYORES de 18\n\n");
printf("Nombre: %s\n", reg.nombre); printf("Apellido: %s\n", reg.apellido); printf("Edad: %d\n", reg.edad); printf("Domicilio: %s\n\n", reg.domicilio); cont = 1; } } } while (!feof(a)); }
fclose(a); getch(); }
void buscar_nombre() {
char nombre[20]; short aux = 0;
printf("BUSQUEDA PERSONA POR NOMBRE\n\n"); printf("Nombre: "); scanf("%s", &nombre);
if ( (a = fopen("datos.dat", "r") ) == NULL ) {
printf("Error a abrir archivo\n"); } else {
do {
fread(®, sizeof(reg), 1, a);
if ( feof(a))
printf("fin de lectura\n");
else { if ( strcmp(nombre, reg.nombre) == 0) {
if ( aux == 0)
printf("Se encontro a:\n\n");
printf("Nombre: %s %s\n", reg.nombre, reg.apellido); printf("Edad: %d\n", reg.edad); printf("Domicilio: %s\n", reg.domicilio); aux = 1; } }
} while (!feof(a)); }
fclose(a); getch(); }
|
La idea es que me pueda tomar un domicilio el cual puede llevar un espacio en blanco (Ejemplo "juan claro"), pues hay calles que llevan espacios en blanco. Poniendo cin.getline para almacenar el domicilio con espacio blanco, con su #include <iostream> respectivo, funciona lo que quiero realizar, pero entiendo que esa función es de c++ y me gustaría que sólo fuera con c.
muchas gracias por las respuestas. |
| | Volver arriba | |  | mamntc02
Registrado: 30 Abr 2007 Mensajes: 266
| Publicado: 06/11/2007 1:00 am | | | Título: |
| Hola,
Para recuperar una cadena por teclado usa gets(). scanf sólo lee hasta el primer espacio en blanco. Se le puede decir q lo evite, creo, pero no recuerdo como Igualmente creo q, para cadenas, es mejor usar gets, y dejar scanf para temas de formateo.
PD: Estoy ejecutando tu programa, y no sé pq al salir del programa (aún sin hacer nada) el programa casca (Sale la típica ventanita de XP de reportar el error a Microsoft). Lo estoy probando en WinXP SP2, usando g++ de GNU (MinGW). Parece algún problema de memoria, pero no encuentro el pq. Si veo algo te lo comento.
Saludos. |
| | Volver arriba | |  | david_celta
Registrado: 02 Jun 2005 Mensajes: 110
| Publicado: 07/11/2007 9:45 pm | | | Título: |
| Pienso que el error viene por fgets
fgets, como su nombre lo indica "f" de FILE se utiliza con archivos, (tenemos fgets, fscanf,fprintf... todos utilizados SOLO para archivos), para el teclado se debe usar gets o scanf dependiendo (gets para ingresar una cadena con espacios tal como mencionaron arriba).
Si eso no funciona (poco probable) prueba con cambiar el orden de ingreso de los datos, primero domicilio y despues edad (usando gets o scanf, fgets es para archivo, no para teclado)
Lo del buffer me parece que no es, si alguien que recien comienza tiene problemas con ingresar un dato desde teclado y "la solucion" es meter todo ese codigo para que supuestamente "limpie el buffer" me parece que hace ver al lenguaje como un lenguajillo lleno de errores y solamente sirve para complicar algo que se puede resolver con cosas mas simples.
Simple comentario _________________ Rueda y rueda la vida, rueda y rueda el balón... y detras de la esperanza, palpita cada corazón. |
| | Volver arriba | |  | | rir3760

Registrado: 01 Oct 2004 Mensajes: 3777 Ubicación: Mexico
| Publicado: 08/11/2007 4:56 pm | | | Título: |
| | david_celta escribió: | Pienso que el error viene por fgets
fgets, como su nombre lo indica "f" de FILE se utiliza con archivos, (tenemos fgets, fscanf,fprintf... todos utilizados SOLO para archivos), para el teclado se debe usar gets o scanf dependiendo (gets para ingresar una cadena con espacios tal como mencionaron arriba). |
El error no es producto de la funcion fgets ya que esta puede utilizarse sin ningun problema con la entrada estandar (stdin) en la forma:
| Código: | fgets(reg.domicilio, 25, stdin); |
Despues de todo los flujos (o streams) predeterminados como la entrada estandar (stdin), salida estandar (stdout) y salida estandar de errores (stderr) son, para todo caso practico, archivos en modo texto, el primero en modo lectura y los dos restantes en modo escritura.
| david_celta escribió: | | Si eso no funciona (poco probable) prueba con cambiar el orden de ingreso de los datos, primero domicilio y despues edad (usando gets o scanf, fgets es para archivo, no para teclado) |
La causa del error nos paso desapercibida a todos (me incluyo, mea culpa) con la excepcion de daltomi que advierte en su mensaje que el error es este:
| Código: | void ingresar() { a = fopen("datos.dat", "w"); /* modo ESCRITURA */ /* ... */ printf("Edad: "); scanf("%d", ®.edad); /* eliminar resto de la linea */ { int ch; while ((ch = getchar()) != EOF && ch != '\n') ; } printf("Domicilio: "); fgets(reg.domicilio, 25, a); /* <=== ??? */ /* ... */ } |
El error no es utilizar la funcion fgets sino tratar de leer la linea de texto a almacenar en "reg.domicilio" no de la entrada estandar (lo correcto) sino del archivo abierto dentro de esa funcion, esto no es posible porque el archivo se abre en modo escritura y por ende solo se pueden escribir datos en el.
| david_celta escribió: | | Lo del buffer me parece que no es, si alguien que recien comienza tiene problemas con ingresar un dato desde teclado y "la solucion" es meter todo ese codigo para que supuestamente "limpie el buffer" me parece que hace ver al lenguaje como un lenguajillo lleno de errores y solamente sirve para complicar algo que se puede resolver con cosas mas simples. |
Yo no me atreveria a ser tan contundente por dos razones:
* Primero que nada porque no es una "solucion" entre comillas sino la solucion del problema, uno bastante comun si revisamos los mensajes en el base de datos de los foros.
* Segundo "todo ese codigo" en realidad son solo dos sentencias, una declaracion de variable y un bucle que efectivamente elimina el resto de la linea de texto en la entrada estandar:
| Código: | /* eliminar resto de la linea */ { int ch; while ((ch = getchar()) != EOF && ch != '\n') ; } |
----
Ya por ultimo una de las virtudes (o defectos, dependiendo del punto de vista) del lenguaje C es que no es un "lenguaje con rueditas", hace bastante tiempo Kernighan y Ritchie lo expresaron de la mejor forma en su libro "K&R2":
"C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly."
Un saludo _________________ The capacity to learn is a gift; The ability to learn is a skill; The willingness to learn is a choice. -- Rebec of Ginaz |
| | Volver arriba | |  | david_celta
Registrado: 02 Jun 2005 Mensajes: 110
| Publicado: 21/11/2007 7:01 pm | | | Título: |
| sigue con return EXIT_SUCCESS;
| Cita: | La causa del error nos paso desapercibida a todos (me incluyo, mea culpa) con la excepcion de daltomi que advierte en su mensaje que el error es este: Código: void ingresar() { a = fopen("datos.dat", "w"); /* modo ESCRITURA */
/* ... */
|
Eso es obvio, porque lo que queria el que pregutó, era GUARDAR en el archivo los datos leidos del TECLADO con gets o scanf y no con fgets
¿o acaso tu abres un archivo en modo lectura "r" para escribir en él y un archivo en modo escritura "w" para leer de él?
- lectura - _________________ Rueda y rueda la vida, rueda y rueda el balón... y detras de la esperanza, palpita cada corazón. |
| | Volver arriba | |  | rir3760

Registrado: 01 Oct 2004 Mensajes: 3777 Ubicación: Mexico
| Publicado: 22/11/2007 9:07 am | | | Título: |
| | david_celta escribió: | | sigue con return EXIT_SUCCESS; |
A que te refieres con eso?
| david_celta escribió: | | rir3760 escribió: | | La causa del error nos paso desapercibida a todos (me incluyo, mea culpa) con la excepcion de daltomi que advierte en su mensaje [...] |
Eso es obvio, porque lo que queria el que pregutó, era GUARDAR en el archivo los datos leidos del TECLADO con gets o scanf y no con fgets |
No. Lo que el OP (creador del tema) pregunto fue (enfasis de mi parte):
| K1LL3RDO6 escribió: | | Estoy tratando de usar la función fgets para recibir un string, mi problema es que al ejecutar el programa, se salta la lectura del string. |
Un saludo _________________ The capacity to learn is a gift; The ability to learn is a skill; The willingness to learn is a choice. -- Rebec of Ginaz |
| | Volver arriba | |  | | david_celta
Registrado: 02 Jun 2005 Mensajes: 110
| Publicado: 22/11/2007 2:00 pm | | | Título: |
| | Cita: | No. Lo que el OP (creador del tema) pregunto fue (enfasis de mi parte): K1LL3RDO6 escribió: Estoy tratando de usar la función fgets para recibir un string, mi problema es que al ejecutar el programa, se salta la lectura del string.
|
A ver veamos, me parece que no has leido bien.
Primero: Para que esta poniendo el codigo fuente ¿de adorno? ¿para llenar espacio?. ¿o para que alguien al menos lea un poco de su codigo? Mismisima regla del foro: Poner el codigo fuente de lo que se ha avanzado. ¿para que? Podrias hacerte esa pregunta e intentar darte una respuesta a ti mismo.
Segundo: Yo escribi esto: "Eso es obvio, porque lo que queria el que preguntó, era GUARDAR en el archivo..." y tu me sales con lo que esta citado arriba "Lo que el OP (creador del tema) pregunto...". Una cosa es lo que preguntó y otra cosa es lo que necesitaba(quería) realmente. Punto aparte es la cuestion de que no haya formulado bien la pregunta el OP(¿?), pero si te han puesto el codigo y tienes algo de tiempo para mirarlo e intentar dar una solucion que ayude, pues adelante. Y si no tienes tiempo (o no quieres leer codigo fuente) entonces...
Tercero: Tambien escribiste esto "El error no es producto de la funcion fgets ya que esta puede utilizarse sin ningun problema con la entrada estandar (stdin) en la forma: ...". Pregunto yo ¿para que se han creado las funciones sino son para ayudar?. Si se ha creado gets para leer del teclado y fgets para leer del archivo, pues usemoslas asi. Es como si uno usara la funcion strlen para calcular la longitud de un numero, cuando se sabe que esa funcion se usa para calcular la longitud de una cadena de caracteres. Claro que ahora me puedes decir que convirtamos el numero a cadena y entonces se puede. El hecho que conozcas un poco mas del lenguaje debe servir para ayudar a los demas, especialmente a aquellos que recien empiezan como parecia era el caso del OP(¿?).
En fin, no voy a discutir contigo primero por que no quiero y segundo porque no es importante, tu tienes tu punto de vista y yo el mio.
"Primero que nada porque no es una "solucion" entre comillas sino la solucion del problema, uno bastante comun si revisamos los mensajes en el base de datos de los foros"
Fin.
PD: "A que te refieres con eso? " Precisamente a lo anterior, tu tienes tu propio punto de vista, entonces sigue con tu propio punto de vista.
Ahora si fin. Saludo++ _________________ Rueda y rueda la vida, rueda y rueda el balón... y detras de la esperanza, palpita cada corazón. |
| | Volver arriba | |  | rir3760

Registrado: 01 Oct 2004 Mensajes: 3777 Ubicación: Mexico
| Publicado: 22/11/2007 3:56 pm | | | Título: |
| | david_celta escribió: | | Segundo: Yo escribi esto: "Eso es obvio, porque lo que queria el que preguntó, era GUARDAR en el archivo..." y tu me sales con lo que esta citado arriba "Lo que el OP (creador del tema) pregunto...". Una cosa es lo que preguntó y otra cosa es lo que necesitaba(quería) realmente. |
Lo siento pero como argumento eso no sirve. Las adivinanzas las dejo para cuando (por desgracia y de forma muy comun) no dan toda la informacion necesaria.
Por el contrario en este tema el OP describe muy bien su problema, basta leer el primer mensaje para entender cual es, esto queda bastante claro y resumido al final de ese mensaje:
| K1LL3RDO6 escribió: | | Como se puede ver, después de "Domicilio" me dice inmediatamente que el registro está grabado, y no me permite ingresar el domicilio de la persona. |
| david_celta escribió: | | Tercero: Tambien escribiste esto "El error no es producto de la funcion fgets ya que esta puede utilizarse sin ningun problema con la entrada estandar (stdin) en la forma: ...". Pregunto yo ¿para que se han creado las funciones sino son para ayudar?. Si se ha creado gets para leer del teclado y fgets para leer del archivo, pues usemoslas asi. |
Lo primero que hay que recordar es que el uso de fgets no es recomendacion mia, quien eligio utilizar esa funcion fue K1LL3RDO6.
Segundo en tu primera participacion en el tema comentas que es posible que el error se deba al uso de fgets porque esas funciones solo pueden utilizarse con archivos, lo que no es correcto: cuando se requiere de la lectura de una linea de texto de la entrada estandar una de las opciones es fgets (la otra es desarrollar una funcion propia basada en getchar/getc/etc.).
Por ultimo el uso de gets no es, en ningun caso, recomendable porque esa funcion es B-A-S-U-R-A (cow manure para ser mas exactos) y no deberia utilizarse porque en C estandar no puedes conocer de antemano el tamaño del bufer de la entrada estandar (y si lo conoces es mas eficiente utilizar una solucion especifica (y segura) del entorno).
| david_celta escribió: | En fin, no voy a discutir contigo primero por que no quiero y segundo porque no es importante, tu tienes tu punto de vista y yo el mio.
"Primero que nada porque no es una "solucion" entre comillas sino la solucion del problema, uno bastante comun si revisamos los mensajes en el base de datos de los foros"
Fin.
PD: "A que te refieres con eso? " Precisamente a lo anterior, tu tienes tu propio punto de vista, entonces sigue con tu propio punto de vista. |
No. Con eso me refiero a algo muy sencillo y que no tiene relacion alguna con el punto de vista de cada uno: la solucion al problema que describe K1LL3RDO6 es la que yo indique (agregando la correcion de daltomi).
Un saludo _________________ The capacity to learn is a gift; The ability to learn is a skill; The willingness to learn is a choice. -- Rebec of Ginaz |
| | Volver arriba | |  | david_celta
Registrado: 02 Jun 2005 Mensajes: 110
| Publicado: 22/11/2007 4:36 pm | | | Título: |
| | Su excelencia rir3760 escribió: | La solucion al problema que describe K1LL3RDO6 es la que yo indique
|
Como dije: Fin de la discusión. _________________ Rueda y rueda la vida, rueda y rueda el balón... y detras de la esperanza, palpita cada corazón. |
| | Volver arriba | |  | | |
| No puede crear mensajes No puede responder temas No puede editar sus mensajes No puede borrar sus mensajes No puede votar en encuestas
|
|
| |