Visualizzazione dei risultati da 1 a 2 su 2
  1. #1

    fclose() Linguaggio C

    Ciao ragazzi,
    sto costruendo programmino per un esame in università ma sto sbattendo la testa per un crash che il programma espone solo nel sistema operativo XP ambiente di sviluppo Dev Cpp 4.9.9.2 e negli altri sistemi operativi va egregiamente.

    In pratica ho una funzione che mi salva il lavoro su un file. funzione save

    int save (String nome_file)
    {
    //dichiarazione dei file (di testo e binario) da utilizzare
    FILE *file_txt;
    FILE *file_bin;

    /*
    * allocazione di memoria per il nome del file di testo:
    * conviene allocare abbastanza spazio per garantire
    * maggior sicurezza ed evitare il crash per poca memoria
    */
    String nome_file_txt = (String) malloc (20 * sizeof(String));
    /*
    * allocazione di memoria per il nome del file binario:
    * conviene allocare abbastanza spazio per garantire
    * maggior sicurezza ed evitare il crash per poca memoria
    */
    String nome_file_bin = (String) malloc (20 * sizeof(String));

    int i; //dichiarazione di un indice

    //controlla se il nome del file è una stringa vuota
    if (strcmp(nome_file, "\0") == 0)
    return String_Pool.KO_NULL_STRING;

    //creazione del file di testo
    strcpy(nome_file_txt, nome_file);
    strcat(nome_file_txt, "\0");
    strcat(nome_file_txt, ".txt");
    strcat(nome_file_txt, "\0");

    //creazione del file binario
    strcpy(nome_file_bin, nome_file);
    strcat(nome_file_bin, "\0");
    strcat(nome_file_bin, ".bin");
    strcat(nome_file_bin, "\0");

    /* CONTROLLO DELL'ESISTENZA DEI FILE */
    file_txt = fopen(nome_file_txt, "r"); //apertura in lettura del file txt
    /*
    * è sufficiente controllare se è presente almeno un formato
    * perchè i file vengono salvati con lo stesso nome
    */
    if (file_txt != NULL)
    {
    fclose(file_txt); //chiusura del file di testo ***********************
    return String_Pool.KO_DUPLICATE_FILE; //file già presente
    }

    /* CONTROLLO DELLA DIMENSIONE DELLA STRUTTURA E SALVATAGGIO SU FILE */
    if (dimension() == 0) //controlla se StringPool è pieno
    return String_Pool.KO_NO_DATA; //StringPool è vuoto
    else
    {
    /* FILE DI TESTO */
    //apertura del file di testo
    file_txt = fopen(nome_file_txt, "w");
    //stampa il contenuto di StringPool sul file di testo
    fprintf(file_txt, toString());
    //chiusura del file di testo
    fclose (file_txt);

    /* FILE BINARIO */
    //apertura del file binario
    file_bin = fopen(nome_file_bin, "ab");
    //cicla sul numero di elementi della struttura
    for (i = 0; i < n_elementi; i++)
    {
    //controlla se il campo identifier è pieno o meno
    if (sp->identifiers[i] != -1)
    {
    //stampa i dati (identificatore e stringa) sul file binario
    fwrite(&sp->identifiers[i], sizeof(int), 1, file_bin);
    fwrite(sp->strings[i], 20, 1, file_bin);
    }
    }
    fclose(file_bin); //chiusura del file binario
    return String_Pool.SUCCESS; //salvataggio avvenuto con successo
    }
    free(nome_file_txt); //libera la memoria allocata precedentemente
    free(nome_file_bin); //libera la memoria allocata precedentemente
    }


    Il problema non nasce nella seconda parte, cioè la parte che mi salva in file binario.
    Il problema è nella prima parte quando lo salva in un file di testo. Infatti utilizzo una funzione "toString()" che mi restituisce un tipo String (char*) che utilizzo nella funzione fprintf.

    Utilizzando il metodo delle stampe per risolvere il problema il crash nasce al primo fclose(file_txt).

    E' un problema che viene rilevato solo in windows xp. Sarà una mal gestione dei puntatori su file da parte di Xp?

    Help me!

    Grazie anticipatamente

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,481

    Re: fclose() Linguaggio C

    Originariamente inviato da davidellolio
    E' un problema che viene rilevato solo in windows xp. Sarà una mal gestione dei puntatori su file da parte di Xp?
    XP non gestisce puntatori, ne' male ne' bene.

    Semmai e' il tuo programma che li utilizza male e il fatto che il problema si verifichi in XP (e non in altri sistemi) non e' indicativo perche', se viene "sporcata" la memoria, le conseguenze sono imprevedibili (potresti non accorgertene come potrebbe crashare tutto).

    Cominciamo da

    String nome_file_txt = (String) malloc (20 * sizeof(String));

    ... se String e' un puntatore a char, che senso ha allocare lo spazio per 20 puntatori a char? Dovresti usare sizeof(char) per una stringa di 20 caratteri (19+terminatore) ...

    Non e' questo sicuramente il problema (non e' l'unico) ma questo ti indica che la gestione della memoria e dei puntatori nel tuo programma e' sbagliata.

    Controlla tutto il codice nuovamente (e postalo corretto usando i tag quote ...).
    No MP tecnici (non rispondo nemmeno!), usa il forum.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.