apatriarca ha scritto:I tuoi dubbi non hanno nulla a che fare con gli alberi binari, ma solo con l'uso della libreria "stdio.h". Il codice che hai postato fa comunque un pessimo uso di tale libreria (ma non è certamente colpa tua).
ungetc è una funzione che inserisce un carattere all'inizio del buffer di lettura in modo che alla successiva lettura questo carattere sarà il primo letto. Nel tuo codice viene usato per "annullare" la lettura del carattere nel caso in cui questo carattere sia diverso da quello che ci si aspetta.
fscanf(fd, "%c", &c) legge un singolo carattere dallo stream e lo scrive in c. È del tutto equivalente a c = getc(fd) . Sarebbe stato in effetti stato meglio usare getc in quanto MOLTO più efficiente, sicura..
LeggiNoSpazi non so cosa faccia esattamente, ma immagino che sia una funzione che ignora tutti gli spazi fino al primo carattere diverso da uno spazio. Sarebbe stato allora sufficiente scrivere fscanf(fd, " %c", &c) con lo spazio prima di %c per fare la stessa cosa.
adesso che ho capito a cosa serve ungetc, credo che nel programma sia totalmente inutile.
Ho riscritto il codice in questo modo:
- Codice:
fscanf(fp, " %c", &c);
if( c!='(' )
{
return NULL;
}
fscanf(fp, " %c", &c);
if( c==')' )
return NULL;
a=malloc(sizeof(struct albero));
a->radice=c;
a->s=make_albero(fp);
a->d=make_albero(fp);
fscanf(fp, "%c", &c);
return a;
comunque funziona tutto, francamente non capisco a cosa servisse fgetc nel codice precedente.
Ho messo lo spazio nell'acquisizione di %c su fscanf (come consigliato da te) e legge il carattere dopo lo spazio.
Secondo te ho tralasciato qualcosa di importante, oppure ungetc era strettamente necessario?