[ Foro de C ]

Problema ejercicio pag.93

22-Oct-2009 21:30
mario moreno
6 Respuestas

Bueno, yo también tengo un problemilla con este ejercicio. Aquí pongo el código:

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

#define LONG 80

   struct
       {
           char nombre [LONG + 1];
           char direccion [LONG + 1];
           int tfnomovil;
           char mail[LONG + 1];
           int dia, mes, anyonacimiento;
       }agenda[100];

       char textotemporal [80];

   int main (void)

       {
           FILE *fichero;
           int opcion;
           int numerofichas = 0;
           char nombre[80];
           char nombrefichero [80] = "E:\\Mis documentos\\Programación\\Ficheros con tipo\\agenda.txt";
           int i;

           //Creamos el menú principal
           do{
               printf("\nIntroduzca una opcion: \n");
               printf("\n1.- Introducir nuevo registro\n");
               printf("\n2.- Visualizar registro\n");
               printf("\n3.- Ver nombres de registros\n");
               printf("\n4.- Salir\n");
               printf("\nOpcion: ");
               gets(textotemporal);
               sscanf(textotemporal, "%d", &opcion);

           //Desarrollamos las diferentes opcines con swicht
           switch (opcion){
               case 1:     if (numerofichas <100){
                           fichero = fopen("agenda.txt", "at");
                           printf("\nIntroduzca un nombre: ");
                           gets(agenda[numerofichas].nombre);
                           fprintf(fichero, "%s\n", agenda[numerofichas].nombre);
                           printf("\nIntroduzca la dirección: ");
                           gets(agenda[numerofichas].direccion);
                           fprintf(fichero, "%s\n", agenda[numerofichas].direccion);
                           printf("\nIntroduzca tfno. movil: ");
                           gets(textotemporal);
                           sscanf(textotemporal, "%d", &agenda[numerofichas].tfnomovil);
                           fprintf(fichero, "%d\n", agenda[numerofichas].tfnomovil);
                           printf("\nIntroduzca dirección mail: ");
                           gets(agenda[numerofichas].mail);
                           fprintf(fichero, "%s\n", agenda[numerofichas].mail);
                           printf("\nIntroduzca día de nacimiento: ");
                           gets(textotemporal);
                           sscanf(textotemporal, "%d", &agenda[numerofichas].dia);
                           fprintf(fichero, "%d\n", agenda[numerofichas].dia);
                           printf("\nIntroduzca mes de nacimiento: ");
                           gets(textotemporal);
                           sscanf(textotemporal, "%d", &agenda[numerofichas].mes);
                           fprintf(fichero, "%d\n", agenda[numerofichas].mes);
                           printf("\nIntroduzca año de nacimiento: ");
                           gets(textotemporal);
                           sscanf(textotemporal, "%d", &agenda[numerofichas].anyonacimiento);
                           fprintf(fichero, "%d\n", agenda[numerofichas].anyonacimiento);
                           numerofichas ++;
                           fclose(fichero);
               }
                           break;
               case 2:     fichero = fopen(nombrefichero, "rt");
                           if(fichero == NULL){
                               printf("\nNO EXISTE EL FICHERO!!");
                               exit (1);
                           }

                           while (! feof(fichero)){
                           fgets(agenda[numerofichas].nombre, 80, fichero);
                           fgets(agenda[numerofichas].direccion, 80, fichero);
                           fgets(textotemporal, 80, fichero);
                           sscanf(textotemporal, "%d", &agenda[numerofichas].tfnomovil);
                           fgets(agenda[numerofichas].mail, 80, fichero);
                           fgets(textotemporal, 80, fichero);
                           sscanf(textotemporal, "%d", &agenda[numerofichas].dia);
                           fgets(textotemporal, 80, fichero);
                           sscanf(textotemporal, "%d", &agenda[numerofichas].mes);
                           fgets(textotemporal, 80, fichero);
                           sscanf(textotemporal, "%d", &agenda[numerofichas].anyonacimiento);
                           numerofichas ++;
                           };


                           printf("\nIntroduzca un nombre: ");
                           gets(nombre);



                           for (i=0; i<numerofichas; i++)
                           if (strcmp(agenda[i].nombre, nombre) == 0)
                           printf("\n%s%s", agenda[i].nombre, agenda[i].direccion);
                           fclose(fichero);
                           break;
               case 3:     for (i=0; i<numerofichas; i++)
                           printf("%s", agenda[i].nombre);
                           system("pause");
                           break;
               case 4:     if (opcion == 4)
                           break;

               default:    printf("\nOPCION NO VALIDA!!!");
                           break;

               }
               }while (opcion != 4);
           }


El problema que tengo es en el "case: 2". Mi intención es que se lean los datos del fichero "agenda.txt" y me los introduzca en el struct de nuevo, para posteriormente que me los muestre al seleccionar un nombre. Yo diría que funciona todo bien hasta el bucle "if (i=0; i<numerofichas; i++). Creo que cuando lee los datos del fichero y los almacena en el estruct de nuevo, no lo hace correctamente, ya que cuando se comparan las cadenas con la función "if (strcmp(agenda[i].nombre, nombre)" no arroja resultados.

Nachooooooooooo ilumíname :)


23-Oct-2009 10:22
mario moreno

Y a mi por que el post no me muestra todo el código que pegué?. Bueno pues lo adjunto en un archivo a ver si se puede ver.

Yo el problema lo tengo en el "case 2" del switch. Intento que lea los datos del fichero "agenda.txt" y me los introduzca en el struct. Hasta aquí parece que todo correcto. Pero cuando se ejecuta el "if" y hace la comparación de cadenas, no funciona.

Me explico:
Cuando creo una ficha (estamos en el case 1 del switch), en nombre por ej. pongo Juan, me lo guarda en "agenda.txt".

Posteriormente lo lee del fichero "agenda.txt" y lo guarda en el struct (estamos en el case 2 del switch).

Pero al comparar luego las cadenas "Juan" (almacenada en la variable "nombre") y la cadena almacenada en el struct (al ser leída del archivo "agenda.txt"), por algún motivo no son iguales en  longitud. No se por que.

¿Alguna ayuda?


23-Oct-2009 11:30
Jesús S.

¡Hola!

No sé si tendrá algo que ver, pero en la definición de nombre lo pones como char de longitud 81(LONG + 1). Sin embargo, cuando lo coges del archivo lo colocas con un campo de 80 caracteres de longitud.

Saludos.


23-Oct-2009 15:52
mario moreno

Hola, ya lo probé y no tiene nada que ver. Lo que he observado (y es lo que me trae de cabeza) es que, vamos a suponer que yo en la variable "nombre" almaceno el nombre "Juan". El tamaño en caracteres de la variable sería el siguiente:

"J" "U" "A" "N" "\0" (o sea, 4 letras y el caracter nulo \0).

Ahora si yo cambio ese "80" que tu me comentas, por un "5" para que me lo lea del archivo, todo va bien y me lo muestra como era de esperar.

Pero a mi entender eso no debería ser así, pues en cuanto el nombre almacenado en el archivo de texto cambiase en tamaño, me encontraría otra vez con el mismo problema, no me lo mostraría. Y no voy a estar contando yo las letras del nombre, para eso está el programa.

No se si me has entendido lo que quiero decir.


23-Oct-2009 22:52
Roberto rrs

Mencionas en tu mensaje que el case3 te funciona.
Prueba a hacer una cosa, te lo digo, porque a mi me pasaba tambien,
abres el programa, metes fichas nuevas, ejecutas opcion 3 y veras que te muestra la lista de fichas.
Pero ahora cierra el programa y lo vuelves a abrir, y directamente ejecutas opcion 3 y ya no te muestra los nombres de las fichas.......

A mi me ha pasado y despues de darle muchas vueltas creo que el problema es que en el fichero solo se guardan los datos y no la asociacion al struct, por lo que hay que lee la posicion que la cadena ocupa en el fichero, yo lo he conseguido de esta manera:

case 2: /*Visualizar los nombres de las fichas existentes*/
              b=0,c=1;
              fichero=fopen("agenda.dat", "rt");
              while (!feof(fichero))
              { fgets (linea,30, fichero);
                if (b==c) {puts (linea);
                           c=b+6;}
                b++;
                }
              fclose(fichero);
             break;


Luego tambien tengo el problema que tienes tu en la otra parte de comparar las dos cadenas, cuando lo descubra te cuento.
Saludos.


23-Oct-2009 23:12
Nacho Cabanes (+83)

Para que el fuente se vea correctamente en el foro, justo debajo del mensaje escoge "Formato de texto plano" en la casilla "tipo de formato".

En cuanto a tu duda, un truco que puede ayudarte: dí que te muestre el nombre que está comparando y lo que tú has tecleado. Para comprobar si hay algún espacio o algún otro carácter que sobre, usa algo como

printf("_%s_", texto);

de forma que aparezca un símbolo de subrayado (o cualquier otro) justo antes y después de tu texto, y lo mismo antes y después del nombre. Así verás que no son exactamente iguales.

El motivo lo tienes en la página 91 del curso (versión 0.23, que es la última publicada "para todo el mundo"), en el tercer párrafo desde el final de la hoja.


24-Oct-2009 02:42
Roberto rrs

Hola Mario.
Ya he conseguido solucionar el mismo problema queb tenias tu de comparar las cadenas, la razón es como apunta Nacho Cabanes la que se menciona en la pagina 91 sobre el avance de linea.
Te pongo como lo he hecho:
case 3: /*Mostrar todos los datos de una persona*/
             printf ("Introduce el nombre de la ficha a mostrar: ");
             gets (textoTemporal);
             strcat (textoTemporal,"\n");
             numeroFichas=a-1;
             for (b=0;b<=numeroFichas;b++)
             { if (strcmp (textoTemporal, fichas[b].nombre)==0)
                   {printf ("Nombre: %s\n", fichas[b].nombre);
                    printf ("Direccion: %s\n", fichas[b].direccion);
                    printf ("Movil: %s\n", fichas[b].movil);
                    printf ("Dia: %u\n", fichas[b].dia);
                    printf ("Mes: %u\n", fichas[b].mes);
                    printf ("Anyo: %u\n", fichas[b].anyo);}
             }






(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)