Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - DickGumshoe

#371
Ya lo he solucionado.

Era poniendo getchar(); debajo de

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


(Se me olvidó ese scanf).
#372
Gracias.

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

Saludos.
#373
He puesto
while(getchar()!='\n');
detrás de cuando pido 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.
#374
¡Muchas gracias! Ya lo he añadido a mi código.

Por ahora tengo esto:

/*Una agenda que maneje los siguientes datos: nombre, dirección, tlf móvil, email, y día,
mes y año de nacimiento (estos tres últimos datos deberán ser números enteros
cortos). Deberá tener capacidad para 100 fichas. Se deberá poder añadir un dato
nuevo, visualizar los nombres de las fichas existentes, o mostrar todos los datos de una
persona (se preguntará al usuario cual es el nombre de esa persona que quiere
visualizar). Al empezar el programa, leerá los datos de un fichero llamado "agenda.dat"
(si existe). Al terminar, guardará todos los datos en ese fichero.*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
    struct
    {
      char nombre[10];
      char direccion[15];
      int movil;
      char email[20];
      short int dia, mes, ano;
    }datos[100];
    char lineas[500],comprobar[10];
    FILE* fichero;
    int opcion,posicion,tamano,i,j,aux;
   
    fichero = fopen("agenda.dat", "r+t");
    if(fichero != NULL)
    {
   
    while(! feof(fichero)) //Leemos los datos que contiene al principio
    {
      fgets(lineas,25,fichero);
    }
   
    /*posicion actual*/
    posicion = ftell(fichero);

    /* final del fichero */
    fseek(fichero,0,SEEK_END);

    /* total de lineas */
    tamano = ftell(fichero);

   
    fseek(fichero,posicion,SEEK_SET);

    i = tamano / sizeof(datos);
   
    do
    {
    do
    {
    printf("Elija una opcion\n");
    printf("1. Introducir datos\n");
    printf("2. Visualizar nombres de las fichas existentes\n");
    printf("3. Mostrar todos los datos de una persona\n");
    printf("4. Salir");
    scanf("%d",&opcion);
   
    switch(opcion)
    {
      case 1:
           
           printf("Introduce un nombre: ");
           fgets(datos[i].nombre, 10, stdin);
           while(getchar() != '\n');
           printf("Introduce una direccion: ");
           fgets(datos[i].direccion, 8, stdin);
           printf("Introduce un movil: ");
           scanf("%d",&datos[i].movil);
           while(getchar() != '\n');
           printf("Introduce correo electronico: ");
           fgets(datos[i].email, 50, stdin);
           printf("Introduce dia de nacimiento: ");
           scanf("%d",&datos[i].dia);
           while(getchar() != '\n');
           printf("Introduce mes de nacimiento: ");
           scanf("%d",&datos[i].mes);
           while(getchar() != '\n');
           printf("Introduce ano de nacimiento: ");
           scanf("%d",&datos[i].ano);
           i++;
           break;
      case 2:
           for(j=0;j<=i;j++)
           {
             puts(datos[j].nombre);
           }
             
             
           break;
      case 3:
          printf("Introduce el nombre de la persona de la que desea visualizar los datos:");
          fgets(comprobar, 10, stdin);
         
          for(j=0;j<=i;j++)
          {
            if(strcmp(datos[j].nombre,comprobar)==0)
            {
              printf("Nombre: %s\n",datos[j].nombre);
              printf("Direccion: %s\n",datos[j].direccion);
              printf("Movil: %d\n",datos[j].movil);
              printf("Email: %s\n",datos[j].email);
              printf("Dia de nacimiento: %d\n",datos[j].dia);
              printf("Mes de nacimiento: %d\n",datos[j].mes);
              printf("Ano de nacimiento: %d\n",datos[j].ano);
            }
          }
           break;
      case 4:
           break;
      default:
              printf("Opcion no valida!\n");
    }
   
    }while(opcion<1||opcion>4);
    }while(opcion!=4);
    }
    aux=i;
    for(i=0;i<=aux;i++)
    {
      fprintf(fichero, "%s\n", datos[i].nombre);
      fprintf(fichero, "%s\n", datos[i].direccion);
      fprintf(fichero, "%d\n", datos[i].movil);
      fprintf(fichero, "%s\n", datos[i].email);
      fprintf(fichero, "%d\n", datos[i].dia);
      fprintf(fichero, "%d\n", datos[i].mes);
      fprintf(fichero, "%d\n", datos[i].ano);
      }
   fclose(fichero);
   
    getchar();
    printf("\n\nPulse una tecla para continuar");
    getchar();
    return 0;
}


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

Gracias.

Saludos.
#375
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.

case 1:
           
           printf("Introduce un nombre: ");
           fgets(datos[i].nombre, 10, stdin);
           printf("Introduce una direccion: ");
           fgets(datos[i].direccion, 15, stdin);
           printf("Introduce un movil: ");
           scanf("%d",&datos[i].movil);
           printf("Introduce correo electronico: ");
           fgets(datos[i].email, 50, stdin);
           printf("Introduce dia de nacimiento: ");
           scanf("%d",&datos[i].dia);
           printf("Introduce mes de nacimiento: ");
           scanf("%d",&datos[i].dia);
           printf("Introduce ano de nacimiento: ");
           scanf("%d",&datos[i].dia);
           i++;
           break;


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

Gracias.

Saludos.
#376
¡Muchas gracias, do-while!

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

#377
¿Al cerrar el fichero "se van" los datos obtenidos con ese fgets del programa?
#378
¿Entonces está bien esto?

while(! feof(fichero)) //Leemos los datos que contiene al principio
    {
      fgets(lineas,25,fichero);
    }
    fclose(fichero);


Lo hago por partes (me refiero a lo de abrir y cerrar el fichero para escribir/leer) porque en el manual que estoy siguiendo en la parte que hay antes del ejercicio no viene nada de cómo hacer las dos cosas (aunque he visto que viene justo después, pero bueno).

Ahora me voy a poner a terminar el programa.

Gracias.

Saludos.
#379
Muchas gracias a los dos. Ahora me tengo que ir ya, pero ya mañana termino el programa y dejo mi código completo.

Saludos.
#380
Pretendo que mientras el fichero no llegue a su fin, lea todas sus líneas (pero por cómo has reaccionado, me parece que voy a tener que quitarlo, seguramente esté mal...).

No había caído en que debía almacenar el resultado de "i++" en un fichero.

Muchas gracias.

Saludos.