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

Rispondi quotando