elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Introducción a Git (Primera Parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Problema en agenda con ficheros
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: 1 [2] 3 Ir Abajo Respuesta Imprimir
Autor Tema: Problema en agenda con ficheros  (Leído 9,419 veces)
DickGumshoe


Desconectado Desconectado

Mensajes: 480



Ver Perfil WWW
Re: Problema en agenda con ficheros
« Respuesta #10 en: 9 Febrero 2012, 15:18 pm »

¡Muchas gracias, do-while!

Creo que como me lo has explicado es mejor que creando un fichero nuevo para guardar los datos.



En línea

DickGumshoe


Desconectado Desconectado

Mensajes: 480



Ver Perfil WWW
Re: Problema en agenda con ficheros
« Respuesta #11 en: 9 Febrero 2012, 19:34 pm »

Me parece que tengo el programa terminado, a excepción  de un error.

Cuando pido los datos de las personas, "Introduce el nombre" e "Introduce la dirección" salen seguidos, sin que yo pueda introducir el primer dato.

Código
  1. case 1:
  2.  
  3.           printf("Introduce un nombre: ");
  4.           fgets(datos[i].nombre, 10, stdin);
  5.           printf("Introduce una direccion: ");
  6.           fgets(datos[i].direccion, 15, stdin);
  7.           printf("Introduce un movil: ");
  8.           scanf("%d",&datos[i].movil);
  9.           printf("Introduce correo electronico: ");
  10.           fgets(datos[i].email, 50, stdin);
  11.           printf("Introduce dia de nacimiento: ");
  12.           scanf("%d",&datos[i].dia);
  13.           printf("Introduce mes de nacimiento: ");
  14.           scanf("%d",&datos[i].dia);
  15.           printf("Introduce ano de nacimiento: ");
  16.           scanf("%d",&datos[i].dia);
  17.           i++;
  18.           break;

¿Cuál creéis que es mi error?

Gracias.

Saludos.


En línea

do-while


Desconectado Desconectado

Mensajes: 1.276


¿Habra que sacarla de paseo?


Ver Perfil
Re: Problema en agenda con ficheros
« Respuesta #12 en: 10 Febrero 2012, 04:26 am »

¡Buenas!

Posiblemente hayas usado varios scanf antes de la llamada a tu funcion.

scanf deja siempre, al menos, un caracter '\n' en el buffer de entrada, y fgets lee hasta encontrar un salto de linea (que extrae del buffer de entrada). Por lo tanto lo que te pasa es que fgets esta leyendo los datos que scanf ha dejado en el buffer de entrada y por eso pasa a leer directamente el segundo dato.

Para que no te pase esto tendras que sacar toda la "basura" que te deje scanf en el buffer de entrada caracter a caracter. Incluye este codigo despues de cada scanf
Código
  1. while(getchar() != '\n');
  2.  

Otros utilizan la formula fgets + sscanf.

Yo personalmente prefieco la de getchar(), ya que no estoy dependiendo de tamaños concretos de cadenas para pasar como argumento a fgets. Pero para gustos colores.

¡Saludos!
En línea

- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!
DickGumshoe


Desconectado Desconectado

Mensajes: 480



Ver Perfil WWW
Re: Problema en agenda con ficheros
« Respuesta #13 en: 10 Febrero 2012, 15:17 pm »

¡Muchas gracias! Ya lo he añadido a mi código.

Por ahora tengo esto:

Código
  1. /*Una agenda que maneje los siguientes datos: nombre, dirección, tlf móvil, email, y día,
  2. mes y año de nacimiento (estos tres últimos datos deberán ser números enteros
  3. cortos). Deberá tener capacidad para 100 fichas. Se deberá poder añadir un dato
  4. nuevo, visualizar los nombres de las fichas existentes, o mostrar todos los datos de una
  5. persona (se preguntará al usuario cual es el nombre de esa persona que quiere
  6. visualizar). Al empezar el programa, leerá los datos de un fichero llamado “agenda.dat”
  7. (si existe). Al terminar, guardará todos los datos en ese fichero.*/
  8.  
  9. #include <stdio.h>
  10. #include <stdlib.h>
  11. #include <string.h>
  12.  
  13. int main()
  14. {
  15.    struct
  16.    {
  17.      char nombre[10];
  18.      char direccion[15];
  19.      int movil;
  20.      char email[20];
  21.      short int dia, mes, ano;
  22.    }datos[100];
  23.    char lineas[500],comprobar[10];
  24.    FILE* fichero;
  25.    int opcion,posicion,tamano,i,j,aux;
  26.  
  27.    fichero = fopen("agenda.dat", "r+t");
  28.    if(fichero != NULL)
  29.    {
  30.  
  31.    while(! feof(fichero)) //Leemos los datos que contiene al principio
  32.    {
  33.      fgets(lineas,25,fichero);
  34.    }
  35.  
  36.    /*posicion actual*/
  37.    posicion = ftell(fichero);
  38.  
  39.    /* final del fichero */
  40.    fseek(fichero,0,SEEK_END);
  41.  
  42.    /* total de lineas */
  43.    tamano = ftell(fichero);
  44.  
  45.  
  46.    fseek(fichero,posicion,SEEK_SET);
  47.  
  48.    i = tamano / sizeof(datos);
  49.  
  50.    do
  51.    {
  52.    do
  53.    {
  54.    printf("Elija una opcion\n");
  55.    printf("1. Introducir datos\n");
  56.    printf("2. Visualizar nombres de las fichas existentes\n");
  57.    printf("3. Mostrar todos los datos de una persona\n");
  58.    printf("4. Salir");
  59.    scanf("%d",&opcion);
  60.  
  61.    switch(opcion)
  62.    {
  63.      case 1:
  64.  
  65.           printf("Introduce un nombre: ");
  66.           fgets(datos[i].nombre, 10, stdin);
  67.           while(getchar() != '\n');
  68.           printf("Introduce una direccion: ");
  69.           fgets(datos[i].direccion, 8, stdin);
  70.           printf("Introduce un movil: ");
  71.           scanf("%d",&datos[i].movil);
  72.           while(getchar() != '\n');
  73.           printf("Introduce correo electronico: ");
  74.           fgets(datos[i].email, 50, stdin);
  75.           printf("Introduce dia de nacimiento: ");
  76.           scanf("%d",&datos[i].dia);
  77.           while(getchar() != '\n');
  78.           printf("Introduce mes de nacimiento: ");
  79.           scanf("%d",&datos[i].mes);
  80.           while(getchar() != '\n');
  81.           printf("Introduce ano de nacimiento: ");
  82.           scanf("%d",&datos[i].ano);
  83.           i++;
  84.           break;
  85.      case 2:
  86.           for(j=0;j<=i;j++)
  87.           {
  88.             puts(datos[j].nombre);
  89.           }
  90.  
  91.  
  92.           break;
  93.      case 3:
  94.          printf("Introduce el nombre de la persona de la que desea visualizar los datos:");
  95.          fgets(comprobar, 10, stdin);
  96.  
  97.          for(j=0;j<=i;j++)
  98.          {
  99.            if(strcmp(datos[j].nombre,comprobar)==0)
  100.            {
  101.              printf("Nombre: %s\n",datos[j].nombre);
  102.              printf("Direccion: %s\n",datos[j].direccion);
  103.              printf("Movil: %d\n",datos[j].movil);
  104.              printf("Email: %s\n",datos[j].email);
  105.              printf("Dia de nacimiento: %d\n",datos[j].dia);
  106.              printf("Mes de nacimiento: %d\n",datos[j].mes);
  107.              printf("Ano de nacimiento: %d\n",datos[j].ano);
  108.            }
  109.          }
  110.           break;
  111.      case 4:
  112.           break;
  113.      default:
  114.              printf("Opcion no valida!\n");
  115.    }
  116.  
  117.    }while(opcion<1||opcion>4);
  118.    }while(opcion!=4);
  119.    }
  120.    aux=i;
  121.    for(i=0;i<=aux;i++)
  122.    {
  123.      fprintf(fichero, "%s\n", datos[i].nombre);
  124.      fprintf(fichero, "%s\n", datos[i].direccion);
  125.      fprintf(fichero, "%d\n", datos[i].movil);
  126.      fprintf(fichero, "%s\n", datos[i].email);
  127.      fprintf(fichero, "%d\n", datos[i].dia);
  128.      fprintf(fichero, "%d\n", datos[i].mes);
  129.      fprintf(fichero, "%d\n", datos[i].ano);
  130.      }
  131.   fclose(fichero);
  132.  
  133.    getchar();
  134.    printf("\n\nPulse una tecla para continuar");
  135.    getchar();
  136.    return 0;
  137. }
  138.  

¿Podríais decirme si voy bien? Ya he retirado del código "system("pause");", y lo he sustituido por getchar.

Gracias.

Saludos.
En línea

do-while


Desconectado Desconectado

Mensajes: 1.276


¿Habra que sacarla de paseo?


Ver Perfil
Re: Problema en agenda con ficheros
« Respuesta #14 en: 10 Febrero 2012, 15:51 pm »

¡Buenas!

Esta parte del codigo esta mal (bueno, mal no esta, pero no funcionara como tu quieres):

Código
  1.           fgets(datos[i].nombre, 10, stdin);
  2.           while(getchar() != '\n');
  3.  

Te he dicho que lo de quitar caracteres de la entrada tienes que hacerlo despues de los scanf. Solo funcionara cuando la cadena introducida (contando el intro que pulses) tenga mas de 9 caracteres, ya que entonces al menos quedara un caracter en la entrada. En caso contrario, leera la cadena que introduzcas y se quedara esperando a que introduzcas mas datos para poder leerlos con getchar, por lo que perderas datos que te interesaria guardar, o a una mala, tendras que pulsar intro para que pase al siguiente mensaje solicitando datos.

Como te he dicho antes, fgets tambien extrae el caracter '\n' de la entrada, por lo tanto puedes controlar que se ha vaciado el buffer de entrada de la siguiente manera:

Código
  1. do{
  2.    fgets(cadena,10,stdin);
  3. }while(cadena[strlen(cadena) - 1] != '\n');
  4.  
Asi te aseguras de que con fgets estas leyendo todos los datos de la entrada.

Otra alternativa seria la siguiente:
Código
  1. fgets(cadena,10,stdin);
  2.  
  3. if(cadena[strlen(cadena) - 1] != '\n')
  4.    while(getchar() != '\n');
  5.  

Pero lo que te he indicado en el post anterior solo deberias utilizarlo despues de un scanf.

Otra cosa, veo que estas abriendo el fichero en modo "r+t", no se si es bueno o te puede dar datos extraños el hecho de mezclar lectura/escritura en binario al abrir un fichero en modo texto. Cuando utilices structs de un tamaño fijo, intenta utilizar siempre acceso binario a los ficheros. Asi seguro que no te llevas sorpresas con feof().

¡Saludos!
En línea

- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!
DickGumshoe


Desconectado Desconectado

Mensajes: 480



Ver Perfil WWW
Re: Problema en agenda con ficheros
« Respuesta #15 en: 10 Febrero 2012, 16:18 pm »

He puesto
while(getchar()!='\n');
detrás de cuando pido
Código
  1. datos[i].nombre
porque sino pasa directamente al segundo dato. Es decir, en la consola, me sale Introduce un nombre: Introduce una direccion:

Y ahí se detiene para que introduzca la dirección.

Ya he editado el código para abrirlo en binario en vez de en fichero de texto.

Gracias.

Saludos.
« Última modificación: 10 Febrero 2012, 16:57 pm por DickGumshoe » En línea

do-while


Desconectado Desconectado

Mensajes: 1.276


¿Habra que sacarla de paseo?


Ver Perfil
Re: Problema en agenda con ficheros
« Respuesta #16 en: 10 Febrero 2012, 16:54 pm »

Y yo ya te he dicho en el primer post que he escrito que si te salen los dos mensajes seguidos es porque en alguna parte antes de llamar a tu funcion, has dejado informacion en la entrada. Tambien te he dicho que el codigo que te he dado tienes que usarlo despues de scanf, asi como que si pones despues de fgets los gechar no podras leer los datos de forma correcta (o si, pero sera una tombola).

Tambien te he corregido el hecho de que si pones despues del fgets los getchar, estaras leyendo informacion que no estaras guardando, asi que si te saltan los dos mensajes uno detras de otro poco arreglas leyendo caracteres que no guardas en ninguna parte, lo que estas haciendo es perder datos.

¡Saludos!
En línea

- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!
DickGumshoe


Desconectado Desconectado

Mensajes: 480



Ver Perfil WWW
Re: Problema en agenda con ficheros
« Respuesta #17 en: 10 Febrero 2012, 17:07 pm »

Gracias.

Entonces voy a buscar cuándo dejo información antes de llamar a la función.

Saludos.
En línea

DickGumshoe


Desconectado Desconectado

Mensajes: 480



Ver Perfil WWW
Re: Problema en agenda con ficheros
« Respuesta #18 en: 10 Febrero 2012, 22:28 pm »

Ya lo he solucionado.

Era poniendo getchar(); debajo de

Código
  1. printf("Elija una opcion\n");
  2.    printf("1. Introducir datos\n");
  3.    printf("2. Visualizar nombres de las fichas existentes\n");
  4.    printf("3. Mostrar todos los datos de una persona\n");
  5.    printf("4. Salir");
  6.    scanf("%d",&opcion);
  7.    getchar();

(Se me olvidó ese scanf).
En línea

do-while


Desconectado Desconectado

Mensajes: 1.276


¿Habra que sacarla de paseo?


Ver Perfil
Re: Problema en agenda con ficheros
« Respuesta #19 en: 11 Febrero 2012, 03:39 am »

¡Buenas!

Me alegro de que hayas encontrado el scanf. Ahora recuerda siempre que scanf deja siempre al menos un caracter '\n'. Por lo tanto toma como costumbre terminar de leer el input.

¡Saludos!
En línea

- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!
Páginas: 1 [2] 3 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Problema programando una agenda
Java
Fastolfe 2 4,298 Último mensaje 17 Marzo 2011, 16:02 pm
por Fastolfe
Problema al hacer una Agenda Telefonica en C++ « 1 2 »
Programación C/C++
Y2J 10 17,834 Último mensaje 19 Agosto 2011, 18:21 pm
por Y2J
problema con ejercicio de agenda con punteros
Programación C/C++
attackers 3 5,597 Último mensaje 17 Noviembre 2011, 04:41 am
por attackers
agenda en c... problema con mostrar contactos y buscar contacto en especifico
Programación C/C++
attackers 7 6,578 Último mensaje 21 Noviembre 2011, 19:53 pm
por s00rk
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines