/
Inicio :: Foros

 F.A.Q.F.A.Q.                  Conéctese para revisar sus mensajesConéctese para revisar sus mensajes   

fgets y estructura

 
      Índice del Foro elrincondelc.com -> C/C++ en General
Ver tema anterior :: Ver siguiente tema  
AutorMensaje
K1LL3RDO6



Registrado: 03 Abr 2005
Mensajes: 3

MensajePublicado: 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: 3896
Ubicación: Mexico

MensajePublicado: 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

MensajePublicado: 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: 121
Ubicación: Argentina

MensajePublicado: 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

MensajePublicado: 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: 282

MensajePublicado: 05/11/2007 4:38 am
Título:

Hola,

Volvemos a un error recurrente.
Código:
fflush(stdin)
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

MensajePublicado: 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: 282

MensajePublicado: 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 Wink 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: 161

MensajePublicado: 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
_________________
In all your fantasies,
you always knew
that man and mystery...

...were both in you...
Volver arriba
rir3760



Registrado: 01 Oct 2004
Mensajes: 3896
Ubicación: Mexico

MensajePublicado: 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: 161

MensajePublicado: 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 -
_________________
In all your fantasies,
you always knew
that man and mystery...

...were both in you...
Volver arriba
rir3760



Registrado: 01 Oct 2004
Mensajes: 3896
Ubicación: Mexico

MensajePublicado: 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: 161

MensajePublicado: 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++
_________________
In all your fantasies,
you always knew
that man and mystery...

...were both in you...
Volver arriba
rir3760



Registrado: 01 Oct 2004
Mensajes: 3896
Ubicación: Mexico

MensajePublicado: 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: 161

MensajePublicado: 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.
_________________
In all your fantasies,
you always knew
that man and mystery...

...were both in you...
Volver arriba
      Índice del Foro elrincondelc.com -> C/C++ en General
Página 1 de 1Todas las horas están en GMT - 8 Horas

 
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas

(c) ElRincondelC.com

Un proyecto de UrlanHeat.com