Newsgroup: it.comp.programmare.win32
Titolo: problema con fgets

Ciao a tutti.
Ho scritto una piccola funzione in C
che deve fare il parsing di un file.
Ho quindi, sinteticamente, sritto:
<CODE>
#define MAXROWLEN 4096
int parse_file(char *filename){
FILE *flog;
char *line;
flog = fopen(filename,"r");
if (flog == NULL) {
  prinf("Non posso aprire il file %s\n",filename);
  return -1;
}
char *line=(char*)calloc(MAXROWLEN,sizeof(char));
if (!line) {
  prinf("Non posso allocare la memoria per line\n");
  return -1;
}
while(1) {
  fgets(line,MAXROWLEN,flog);
  /*
   parsing della riga*/
   free(line);
   if (feof(flog)){
     break;
   }
}
fclose(flog);
return 0;
}
</CODE>
Tale funzione viene eseguita ogni 5 secondi,
e il problema è che ogni volta
viene allocata della memoria,
ma questa nn viene deallocata.
Guardando il task manager si vede che
la prima volta che la funzione viene richiamata,
la memoria usata dal programma aumenta di 4K in due punti:
- nel calloc
- nel fgets
e non diminuisce né col free() né con l'uscita dalla funzione!
In seguito aumenta sempre di 4K ma in maniera un po' random:
o sul calloc o sul fgets.
Sto compilando con Visual Studio 2005 su WinXp,
e il problema lo rilevo facendo girare il programma sia su Xp che su NT4
Avete un'idea di come posso risolvere il problema?
Grazie in anticipo per l'attenzione.
bye ;-)

Ciao, credo che il problema sia che la tua free è dentro al while, cioè ogni 
volta che leggi una riga la liberi
#define MAXROWLEN 4096
int parse_file(char *filename)
{
    FILE *flog;
    char *line;
    flog = fopen(filename,"r");
    if (flog == NULL)
    {
        prinf("Non posso aprire il file %s\n",filename);
        return -1;
    }
    char *line=(char*)calloc(MAXROWLEN,sizeof(char));
    if (!line)
    {
        prinf("Non posso allocare la memoria per line\n");
        return -1;
    }
    while(1)
    {
        fgets(line,MAXROWLEN,flog);
        /*  parsing della riga*/
        free(line);        <<--- NON FARLO QUI MA FUORI DAL WHILE
        if (feof(flog))
        {
            break;
        }
    }
   free(line);        <<--- QUI E' CORRETTo
    fclose(flog);
    return 0;
    }

neverland ha scritto:

Hai perfettamente ragione: è sbagliato!
ma purtroppo è un errore che ho fatto solo scrivendo il post...
anche perchè, in questo modo,
la seconda fgets fallirebbe proprio perchè la memoria nn è più allocata.
Ho comunque provato anche a usare un array di char,
dichiarato quindi staticamente,
e che all'uscita della funzione, dovrebbe essere liberato,
ma non è cambiato nulla...
Salvo qualche illuminazione,
credo che dovrò limitare la lettura del file
solo a quando viene modificato
(il che andava comunque fatto)...
Grazie mille per la risposta
bye ;-)

Non credere a quello che dice il task manager
Usa invece memsnap che ti dice esattamente quanto alloca un programma.
Quello che vedi nel task manager non è quanto alloca il programma ma quanta 
memoria sta usando in quel momento. Per esempio io alloco 400MB ma fino a 
che non li uso il mio TM non mi dice che il programma usa 400MB. Spero di 
essere stato chiaro... usa memsnap che si trova nelle support tools di 
windows xp.
Ciaoo
"svetj" <sve...@SPAMMISTItiscali.it> ha scritto nel messaggio 
news:4448a900$0$29095$5fc...@news.tiscali.it...


 
Ciao.
Ho provato memsnap, ma indica la stessa cosa del task manager...
Eppure non capisco quale sia il problema,
dato che in qualunque manuale di C
i file vengono letti nel modo che uso io...
Cercherò di invetarmi qualcos'altro.
Grazie cmq
bye ;-)