Ver Mensaje Individual
  #9 (permalink)  
Antiguo 11/02/2012, 13:50
cesar_casla
 
Fecha de Ingreso: diciembre-2011
Ubicación: CABA
Mensajes: 433
Antigüedad: 13 años
Puntos: 94
Respuesta: Problema creando agenda con ficheros

Hola! ¿formas de hacer este programa? hay varias ¿cual es la forma mas sencilla? en lo particular a mi no me interesa mucho eso, con el tiempo vas a adquirir conocimientos que te va a facilitar hacer el programa.

Con respecto a lo que planteas para leer el archivo en cierta forma esta bien, al principio no le di importancia ya que no hacias nada con el pero lei el enunciado del programa y si tenes que leer el archivo.
En ves de almacenar lo leido del archivo en el arreglo lineas, la idea del programa es que lo hagas en el arreglo de estructuras(en datos[100]). Para eso te recomiendo que uses fscanf:
Código C:
Ver original
  1. while(!feof(fichero)) //Leemos los datos que contiene el archivo
  2.         {
  3.           c=fscanf(fichero,"%s",datos[i].nombre);
  4.           fscanf(fichero,"%s",datos[i].direccion);
  5.           fscanf(fichero,"%d",&datos[i].movil);
  6.           fscanf(fichero,"%s",datos[i].email);
  7.           fscanf(fichero,"%d",&datos[i].dia);
  8.           fscanf(fichero,"%d",&datos[i].mes);
  9.           fscanf(fichero,"%d",&datos[i].ano);
  10.           [B]if(c!=-1) i++;[/B]// evita que i incremente erroneamente
  11.        }
De esta manera vas a guardar todos los datos del archivo en el arreglo. Fijate en el if, lo puse xq, a pesar de que el archivo no tenga nada, va a entrar igual en el while por lo que la variable i va a incrementar(lo cual estaria mal). Con el if, i solo va a incrementar cada vez que se lea correctamente del archivo (fscanf retorna -1 cuando hay un error)


Pasando en limpio el codigo quedaria asi:

Código C:
Ver original
  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.            int dia, mes, ano;
  22.         }datos[100];
  23.         char lineas[500],comprobar[10];
  24.         FILE* fichero;
  25.         int opcion,posicion,tamano,i=0,j,aux;
  26.        int c;
  27.         fichero = fopen("agenda.dat", "r+b");
  28.         if(fichero != NULL)
  29.         {
  30.        
  31.         while(!feof(fichero)) //Leemos los datos que contiene el archivo y los almacenamos en el arreglo datos[100]
  32.         {
  33.           c=fscanf(fichero,"%s",datos[i].nombre);
  34.           fscanf(fichero,"%s",datos[i].direccion);
  35.           fscanf(fichero,"%d",&datos[i].movil);
  36.           fscanf(fichero,"%s",datos[i].email);
  37.           fscanf(fichero,"%d",&datos[i].dia);
  38.           fscanf(fichero,"%d",&datos[i].mes);
  39.           fscanf(fichero,"%d",&datos[i].ano);
  40.           printf("ENTRO WHILE %d\n",c);
  41.           if(c!=-1)i++; // evita incrementar erroneamente
  42.         }
  43.  
  44.         /*posicion actual*/
  45.         //posicion = ftell(fichero);
  46.         //printf("pos: %d\n",posicion);
  47.      
  48.      /* este rewind es necesario ya que al leer los datos con fscanf el cursor se va desplazando, y si no ponemos
  49.      el rewind luego cuando guardemos (con fprintf) se va a guardar datos repetidos */
  50.        rewind(fichero); //posiciona el cursor al inicio. Igual a fseek(fichero,0,SEEK_SET);
  51.      
  52.         do
  53.         {
  54.         do
  55.         {
  56.         printf("iii: %i\n",i);
  57.         printf("Elija una opcion\n");
  58.         printf("1. Introducir datos\n");
  59.         printf("2. Visualizar nombres de las fichas existentes\n");
  60.         printf("3. Mostrar todos los datos de una persona\n");
  61.         printf("4. Salir\n");
  62.         scanf("%d",&opcion);
  63.         getchar();
  64.        
  65.         switch(opcion)
  66.         {
  67.           case 1:
  68.                printf("Introduce un nombre: ");
  69.                //fgets(datos[i].nombre, 10, stdin);
  70.                scanf("%s",datos[i].nombre);
  71.                //getchar
  72.                printf("Introduce una direccion: ");
  73.                //fgets(datos[i].direccion, 8, stdin);
  74.                scanf("%s",datos[i].direccion);
  75.                printf("Introduce un movil: ");
  76.                scanf("%d",&datos[i].movil);
  77.                while(getchar() != '\n');
  78.                printf("Introduce correo electronico: ");
  79.                //fgets(datos[i].email, 50, stdin);
  80.                scanf("%s",datos[i].email);
  81.                printf("Introduce dia de nacimiento: ");
  82.                scanf("%d",&datos[i].dia);
  83.                while(getchar() != '\n');
  84.                printf("Introduce mes de nacimiento: ");
  85.                scanf("%d",&datos[i].mes);
  86.                while(getchar() != '\n');
  87.                printf("Introduce ano de nacimiento: ");
  88.                scanf("%d",&datos[i].ano);
  89.                i++;
  90.                break;
  91.           case 2:
  92.                for(j=0;j<i;j++)
  93.                {
  94.                  printf("%s\n",datos[j].nombre);
  95.                }
  96.                  
  97.                  
  98.                break;
  99.           case 3:
  100.               printf("Introduce el nombre de la persona de la que desea visualizar los datos:");
  101.              scanf("%s",comprobar);
  102.               for(j=0;j<i;j++)
  103.               {
  104.                 if(strcmp(datos[j].nombre,comprobar)==0)
  105.                 {
  106.                   printf("Nombre: %s\n",datos[j].nombre);
  107.                   printf("Direccion: %s\n",datos[j].direccion);
  108.                   printf("Movil: %d\n",datos[j].movil);
  109.                   printf("Email: %s\n",datos[j].email);
  110.                   printf("Dia de nacimiento: %d\n",datos[j].dia);
  111.                   printf("Mes de nacimiento: %d\n",datos[j].mes);
  112.                   printf("Ano de nacimiento: %d\n",datos[j].ano);
  113.                 }
  114.               }
  115.                break;
  116.           case 4:
  117.                break;
  118.           default:
  119.                   printf("Opcion no valida!\n");
  120.         }
  121.        
  122.         }while(opcion<1||opcion>4);
  123.        
  124.         }while(opcion!=4);
  125.         }
  126.         aux=i;
  127.         for(i=0;i<aux;i++)
  128.         {
  129.           fprintf(fichero, "%s\n", datos[i].nombre);
  130.           fprintf(fichero, "%s\n", datos[i].direccion);
  131.           fprintf(fichero, "%d\n", datos[i].movil);
  132.           fprintf(fichero, "%s\n", datos[i].email);
  133.           fprintf(fichero, "%d\n", datos[i].dia);
  134.           fprintf(fichero, "%d\n", datos[i].mes);
  135.           fprintf(fichero, "%d\n", datos[i].ano);
  136.           }
  137.        fclose(fichero);
  138.        
  139.         printf("\n\nPulse una tecla para continuar");
  140.         getchar();
  141.         return 0;
  142.     }

A diferencia de tu programa decidi usar scanf en ves de fgets ¿por que? porque fgets guarda el caracter nueva linea: \n en el bufer lo cual trae mucho dolor de huevo. Si queres proba el fgets pero no te lo recomiendo para este programa. Ademas fijate que agregue la funcion rewind, fijate el comentario que hice.

Espero se entienda el programa cualquier cosa pregunta

Saludos

Última edición por cesar_casla; 11/02/2012 a las 14:01