PDA

View Full Version : [C] loop infinito


tenbota87
24-05-2011, 16:17
Ciao a tutti!
Ho un problema e non riesco a capire il motivo.. quando lo eseguo mi entra in loop, e non esce mai perchè non entra mai in questa condizione:


else
{

fineDecompressione=1; //ho raggiunto la fine del file e ponendo fineDecompressione a 1 esco dal while
}




premetto che alla funzione decomprimi passo un file di n caratteri composto da una successione di numeri (se il numero è 0 lo associo a 256), alternata a caratteri..

Prima del while (fineDecompressione==0) ovviamente apro il file *nomeDelFile in modalità lettura binaria e un altro file in modalità scrittura..

Il problema dovrebbe consistere nel fatto che non trova l'EOF e quindi fineDecompressione non diviene mai uguale a 1 e non esce dal while, entrando così in loop!

LUNGHEZZA_BUFFER_LETTURA è 1000

Riuscite ad aiutarmi? grazie mille per la disponibilità!



void decomprimi(unsigned char *nomeDelFile)
{
...
while(fineDecompressione==0)
{
//fino alla fine del file
numeroByte=fread(bufferLettura,1,LUNGHEZZA_BUFFER_LETTURA,fileBinario);
// printf("\n numeroByte:%d \n",numeroByte);
rewind(fileBinario);
if(!feof(fileBinario)) //se non è la fine del file (End Of File)
{
while(k<numeroByte)
{
numero=bufferLettura[k];
lettera=bufferLettura[k+1];
printf("\n Numero: %d \n",numero);
printf("\n Lettera: %c \n",lettera);
if(numero==0)
{
numero=256;
}
if(lettera==64)
{
lettera=' ';
}
bufferScrittura=(unsigned char*)malloc((numero+1)*sizeof(char));

//allocazione della memoria per bufferScrittura

for(j=0;j<numero;j++)
{
bufferScrittura[j]=lettera;
}

bufferScrittura[j]='\0'; //metto il \0 per andare a scrivere sul file
printf("\n BufferScrittura: %s \n",bufferScrittura);
fileScritto=fwrite(bufferScrittura,1,(numero+1),fileTesto); //scrivo sul file
free(bufferScrittura);
numero=0;
lettera='\0';
k+=2;
}
}
else
{
fineDecompressione=1; //ho raggiunto la fine del file e ponendo fineDecompressione a 1 esco dal while
}
}
printf("\nFine della decompressione!\n");
fflush(stdout);
//chiusura dei file aperti
fclose(fileBinario);
fclose(fileTesto);

}

sottovento
24-05-2011, 16:25
Perche' non elimini la variabile fineDecompressione e piu' semplicemente scrivi:


while((numeroByte=fread(bufferLettura,1,LUNGHEZZA_BUFFER_LETTURA,fileBinario)) > 0)
{

}


A questo punto, puoi anche eliminare il controllo


if(!feof(fileBinario))
{
}


poiche' se sei nel ciclo, SICURAMENTE non sei in EOF

tenbota87
24-05-2011, 16:40
perchè l'esempio che ho riportato funzionava con un fileTesto di 40 caratteri..
ma deve anche funzionare con fileTesto con migliaia di caratteri, per questo ho messo la fread all'interno del while (fineDecompressione==0)

demos88
25-05-2011, 00:35
Perchè metti un rewind appena prima di controllare se sei a fine file?
Non raggiungerai mai la fine del file... mi sa che continui a leggere i soliti bytes all'infinito :wtf:

tenbota87
25-05-2011, 12:04
grazie mille!!! era un errore del cavolo ma non riuscivo proprio a vederlo!

tenbota87
25-05-2011, 14:33
Ora purtroppo mi si presenta un altro problema.. mi scrive il file, ma ogni volta che trova una lettera diversa dalla precedente mi inserisce uno spazio tra le due.. E' una cosa che fa la fwrite, cioè che ogni volta che scrive inserisce uno spazio oppure c'è un errore nel codice che non ho notato??

sottovento
25-05-2011, 14:38
Ora purtroppo mi si presenta un altro problema.. mi scrive il file, ma ogni volta che trova una lettera diversa dalla precedente mi inserisce uno spazio tra le due.. E' una cosa che fa la fwrite, cioè che ogni volta che scrive inserisce uno spazio oppure c'è un errore nel codice che non ho notato??

Non e' lo spazio, sembrerebbe il carattere di fine stringa '\0'


fileScritto=fwrite(bufferScrittura,1,(numero+1),fileTesto);


dovrebbe essere numero, non (numero+1)

tenbota87
25-05-2011, 15:43
grazie mille.. in questo modo dovrebbe andare tutto bene!!

tenbota87
26-05-2011, 16:32
scusate ragazzi, ma mi è sorto un nuovo problema purtroppo.. con tipi di file molto grandi, ad esempio di 250 MB, nella decompressione il bufferLettura non carica tutti i caratteri del file compresso ed esce, decomprimendo in modo sbagliato.. anche modificando la dimensione di LUNGHEZZA_BUFFER_LETTURA non riesco a risolverlo in quanto esce comunque prima di averlo letto tutto!