[C] Domanda su "FILE"

Atem1
Salve ragazzi, stavolta ho un problema veramente curioso.
Se io lancio il programma, esso non funziona.
Se invece lo eseguo sotto DEBUG funziona perfettamente...

Dunque, io ho un file libri.csv che apro in lettura.
Questo file contiene delle righe, ed ogni riga è della forma
TitolodelLibro#NomeAutore CognomeAutore\n

Io devo creare un file autori.txt in cui mettere solo i cognomi diversi, nel mio caso sono 14,
e il .txt del file deve essere della forma
1- cognome1
2- cognome2
...
14- cognome14

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

typedef enum {false,true} boolean;
int main()
{
    FILE *libri, *autori;
    char titolo[200];
    char nome[20];
    char cogn[50];
    char *cognome[100];
    boolean flag;
    int i=0,n=1;


    libri=fopen("libri.csv", "r");
    autori=fopen("autori.txt", "w");

    if ((!libri) || (!autori))
    {
        printf("Impossibile aprire il file");
        exit(1);
    }
    else
    {
        printf("Indirizzo di libri.csv: %d\n", libri);
        printf("Indirizzo di autori.txt %d\n", autori);



        fscanf(libri,"%[^#]#%[^ ] %[^\n]\n",titolo,nome,cogn);
        printf ("Titolo libro: %s \n",titolo);
        printf ("Nome autore: %s \n",nome);
        printf ("Cognome autore: %s \n\n",cogn);

        cognome[0]=calloc(strlen(cogn),sizeof(char));
        strcpy(cognome[0], cogn);


        while (fscanf(libri,"%[^#]#%[^ ] %[^\n]\n",titolo,nome,cogn)>0)
        {

            printf ("Titolo libro: %s \n",titolo);
            printf ("Nome autore: %s \n",nome);
            printf ("Cognome autore: %s \n\n",cogn);
            flag=false;
            for (i=0; i<n;++i) if (!strcmp(cognome[i],cogn)) flag=true;
            if (flag==false)
            {
                cognome[n]=calloc(strlen(cogn),sizeof(char));
                strcpy(cognome[n], cogn);
                ++n;
            }
        }



        for (i=0; i<n; ++i)
        {
            fprintf(autori,"%d-%s\n",i+1, cognome[i]);
            printf ("%s\n", cognome[i]);
            free(cognome[i]);

        }

    }
    fclose(libri);
    fclose(autori);
    return 0;
}





Dunque se lo eseguo normalmente lui mi visualizza su schermo:
Titolo libro: ....
Nome autore: ....
Cognome autore: ....

La seguente riga è scritta a fini di Debug:
printf ("%s\n", cognome[i]);


E non viene eseguita! Non funziona neppure la scrittura su file e l'output si conclude così:

Process returned -1073741819 (0xC0000005) execution time : 0.219 s
Press any key to continue.

Invece se eseguo il programma sotto DEBUG premendo F7 per andare di riga in riga, quella riga che ho scritto a fini di Debug funziona perfettamente! Ed anche la scrittura su file autori.txt funziona perfettamente! Funziona tutto perfettamente sotto DEBUG!

Quale può essere il problema?
Grazie mille per l'attenzione :)

Risposte
Atem1
Come ambiente di sviluppo sto usando Codeblock perchè è quello che usiamo a scuola e useremo all'esame.
Ma ho provato a ricopiare il codice su Dev-C++ e mi visualizza i seguenti errori:
http://imageshack.us/photo/my-images/821/75hd.jpg/

La memoria non poteva essere "read" (prima immagine visto che non si vede la fine della riga)
La memoria non poteva essere "written" (seconda immagine visto che non si vede la fine della riga)

claudio862
cognome[0]=calloc(strlen(cogn),sizeof(char));
strcpy(cognome[0], cogn);

Manca lo spazio per il terminatore finale:

calloc(strlen(cogn) + 1,sizeof(char));

Atem1
"claudio86":
cognome[0]=calloc(strlen(cogn),sizeof(char));
strcpy(cognome[0], cogn);

Manca lo spazio per il terminatore finale:
calloc(strlen(cogn) + 1,sizeof(char));


Uhm ok comunque dice sempre:
Process returned -1073741819 (0xC0000005) execution time : 0.016 s
Press any key to continue.

E di conseguenza non scrive su autori.txt che resta una file vuoto....
Però non capisco perchè se eseguo il programma sotto Debug esso funziona perfettamente...

claudio862
Sono due i punti in cui chiami "calloc", li hai corretti entrambi?

Atem1
"claudio86":
Sono due i punti in cui chiami "calloc", li hai corretti entrambi?


Ehm no l'avevo fatto solo per uno perchè oggi ho iniziato gli "alberi" e avevo la testa a quelli.
Ora l'ho corretto e non mi da più nessun errore. Ora funziona perfettamente.
E mi rendo anche conto che non è la prima volta che faccio l'errore di non allocare lo spazio per il terminatore finale, da adesso in poi ci starò molto più attento, grazie mille...

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.