PDA

View Full Version : fread comportametno strano (linux)


Arpeda
29-10-2003, 15:45
ho un file pgm che inizia con i seguenti caratteri:
P5<spazio>768<spazio>576.<da qui iniziano i dati>

devo caricare questo file in memoria .. ho fato una struttura con i campi
ncols, nrows, data
per settare i valori della struttura uso questo codice:


char *numero = (char*) malloc (5 * sizeof(char));

file2 = fopen("frame.pgm","r");
if (fseek(file2, 3, SEEK_SET)<0) {
perror("Errore nella seek del file2");
exit (1);
}

fread(numero, 3, sizeof(char), file2); //width
due.ncols = atoi(numero);

fread(numero, 4, sizeof(char), file2); //height
due.nrows = atoi(numero);

if (fseek(file2, 15, SEEK_SET) < 0) {
perror("Errore nella seek del file2");
exit (1);
}
due.data = (unsigned char*) malloc (due.ncols * uno.nrows * sizeof(unsigned char));
fread(due.data, uno.ncols*uno.nrows, sizeof(unsigned char), file2);
due.rowinc = due.ncols * sizeof(unsigned char);

fclose(file2);


il codice funziona correttamente per il primo caricamento poi se provo a caricare una seconda immagine, su un'altra struttura, quando va a fare la prima fread si incarta e mi restituisce "7686"! ma come io gli ho detto di leggermi 3 caratteri e lui me ne restituisce 4?!?!

allora ho provato a fare la prima fread leggendo 2 caratteri e mi restituisce "76" (correttamente)
ho provato leggendo 4 caratteri e mi restituisce "768 " ....
la soluzione che ho trovato è:
deallocare numero prima di fare una nuova lettura da file, perchè la lettura del primo file settava numero a " 576" ... e quindi il 6 rimaneva a rompere le scatole ...
la cosa strana è che ho provato anche usando memset ed impostando numero a '\0' ma mi dava lo stesso problema ....

ciao
Arpeda

ilsensine
29-10-2003, 16:18
fread(numero, 3, sizeof(char), file2); //width
due.ncols = atoi(numero);

fread(numero, 3, sizeof(char), file2); //width
numero[3] = '\0'; // Inserisce la terminazione stringa
due.ncols = atoi(numero);


fread(numero, 4, sizeof(char), file2); //height
due.nrows = atoi(numero);

fread(numero, 4, sizeof(char), file2); //height
numero[4] = '\0'; // Inserisce la terminazione stringa
due.nrows = atoi(numero+1); // salta lo spazio iniziale


Questo solo per darti un'idea di quello che devi fare (ovviamente il codice scritto così è da fustigazione).

Arpeda
29-10-2003, 21:36
si l'avevo fatto subito dopo aver postato :D

perchè è da fustigazione?

cmq mi restitusce un valore sballato perchè la seconda fread del primo file legge 4 carattei quindi " 576" ed il 6 rimane quando leggo le 3 cifre del secondo file :D

ciao
Arpeda

ilsensine
30-10-2003, 08:43
Originariamente inviato da Arpeda
perchè è da fustigazione?
Perché non fai alcun controllo sui byte letti da fread e sulla congruenza dei valori. Ad es. il file potrebbe essere corrotto.


cmq mi restitusce un valore sballato perchè la seconda fread del primo file legge 4 carattei quindi " 576" ed il 6 rimane quando leggo le 3 cifre del secondo file :D
Intendi il _primo_ numero del secondo file? E' impossibile se imposti numero[3]='\0' come ti ho suggerito, in quanto sovrascrivi il quarto carattere (il "vecchio" 6).

Arpeda
30-10-2003, 09:16
grazie per il suggerimento.

per la seconda parte del messaggio mi riferivo a _PRIMA_ che facessi numero[3]='\0';

ciao
Arpeda