[ Foro de C ]

Ejercicio 6.10.4...

26-Mar-2014 15:21
Jaime Daviu
4 Respuestas

Hola a todos!
      Tengo un problema (creo que tonto, pero latoso) en el ejercicio 6.10.4 que seguro es de detalle, pero que no logro resolver. Es el siguiente: Trabajo en modo "t" texto y al leer datos de "nombre de la ficha" le suelo poner un nombre y un apellido separados por un espacio. Bien, resulta que al salir del programa me escribe un cero al final y al volver a abrir el archivo para cargar datos me pone el nombre solo en una linea y el apellido y el tamanyo en la siguiente y ademas separados por un 0. Al escribir el archivo para guardar cambios veo que me ha escrito ceros entre el nombre y el apellido y entre este y el tamanyo. Por mas que pruebo con anyadir "\n" o con hacer que me lea un caracter mas de los que le hago escribir no me hace caso.
Este es mi codigo resumido:


/* Ejercicio Cabanes 6.10.4.4 No me funciona aun del todo bien */
#include<stdio.h>
#include<string.h>
#include<stdlib.h>

struct
{
    char nombreFicha[41];
    int tamanyo;
} ficha[10];

int main()
{
    FILE *fichero;
    char nombre[81];
    int i, num, opcion, contador1, nFichas = 0, tamMin;
    char texto1[41];

    printf("Escribe el nombre del fichero que quieres abrir: \n");
    gets(nombre);
    fichero = fopen(nombre, "rt");
    if (fichero != NULL)
    {
        printf("Leyendo fichero... \n");
        i=0;
        do
        {
            fscanf(fichero, "%41s", &ficha[i].nombreFicha);
            fscanf(fichero, "%8d", &ficha[i].tamanyo);
            i++;
            nFichas++;
            if (feof(fichero))
                break;
        }
        while (! feof(fichero));
    }
    else
    {
        printf("El fichero no existe. \n");
        printf("Escriba el nombre del nuevo fichero: \n");
        gets(nombre);
        fichero = fopen(nombre, "wt");  /* Esto no haria falta pero me ayuda a ser capaz de crear un archivo antes */
        if (fichero == NULL)
        {
            printf("El fichero no existe. \n");
            exit(1);
        }
    }
    fclose(fichero);

    do
    {
        printf("Escriba una opcion: \n");
        printf("1. Anyadir ficha: \n");
        printf("2. Mostrar los nombres de todos las fichas: \n");
        printf("3. Mostrar todos los fichas que son mayores de ... tamanyo: \n");
        printf("4. Ver los datos de una ficha: \n");
        printf("5. Buscar ficheros que contengan ... : \n");
        printf("6. Modificar una ficha. \n");
        printf("7. Borrar una ficha. \n");
        printf("8. Salir \n");
        gets(texto1);
        sscanf(texto1, "%d", &opcion);
        fflush(stdin);
        switch (opcion)
        {
            case 1:
                 .....
                 .....
           case 8:
                printf("Fin de programa. \n");
                break;
            default:
                printf("Opcion desconocida. \n");
                break;
        }
    }
    while (opcion != 8);
    if (nFichas == 0)
    {
        printf("No se ha hecho nada. Cerrando. \n");
        exit(1);
    }
    else
    {
        fichero = fopen(nombre, "wt");
        if (fichero == NULL)
        {
            printf("El fichero no existe. \n");
            exit(1);
        }
        for (i=0; i<= nFichas; i++)
        {
            fprintf(fichero, "%40s", ficha[i].nombreFicha);  /* Intente anyadir "\n" pero sigue igual */
            fprintf(fichero, "%7d", ficha[i].tamanyo);  /* Intente anyadir "\n" pero sigue igual */
        }
        fclose(fichero);
    }
    getchar ();
    return 0;
}


Muchas gracias.


28-Mar-2014 23:26
Nacho Cabanes (+83)

Si quieres separar nombre y apellido con un espacio... ¿por qué no usas "fgets" en vez de "fscanf"?

"fscanf" va a leer hasta el primer espacio, salvo que te compliques la vida (innecesariamente) con códigos de formato avanzados. No tiene sentido.

Usa "fgets" si quieres leer línea a línea, y deja "fscanf" para (pocos) casos especiales, como cuando quieras leer un único número de una línea que está formada por varios números separados por espacios.


31-Mar-2014 22:27
Jaime Daviu

Muchas gracias Nacho!
El error que me daba era que me anyadia "0" cada vez que salvava (que a lo mejor son normales y que yo he de purgar al leer).

Por ejemplo, en la segunda vez que guardaba, si abro el .txt:

                          Antonio Amoro
     0
                                     s

  2789
                                     

     0
                      Bernardo Bestard

  1890
                                     

     0
                        Carlos Colomer

 38900
                                     

     0
                          Daniel Daviu

 48890
                                     

     0
                      Eduardo Epidural

  2889
                                     

     0
                                     

     0
                                       
     0

Y en la tercera vez que guardaba, si abro el txt. :

                          Antonio Amoro
     0
                                     

     0
                                     s

  2789
                                     

     0
                                     

     0
                      Bernardo Bestard

  1890
                                     

     0
                                     

     0
                        Carlos Colomer

 38900
                                     

     0
                                     

     0
                          Daniel Daviu

 48890
                                     

     0
                                     

     0
                      Eduardo Epidural

  2889
                                     

     0
                                     

     0
                                     

     0
                                     

     0
                                       
     0

Saludos,
Jaime.


02-Apr-2014 15:30
Nacho Cabanes (+83)

Es raro que te añada ceros. Aun así, insisto: para ficheros de texto que leas línea a línea, suele ser menos arriesgado usar "fgets" y "fputs" que "fscanf" y "fprintf", especialmente si las líneas contienen espacios en blanco.


03-Apr-2014 08:21
Jaime Daviu

De acuerdo, gracias! Así lo haré. Aunque por lo que he leído en el foro, en los próximos ejercicios usaré más la lectura de bloques de bits que de texto.






(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.)