PDA

View Full Version : [Linguaggio C] getc


Tyler Darden
04-04-2007, 16:44
Ciao a tutti ho il seguente dubbio:

Supponiamo che io ho:

if((c = getc(ptr->file)) == '#'){
...
...
codice vario
...
...
}
else if((c = getc(ptr->file)) == '*'){
...
...
codice vario
...
...
}

Ora io mi chiedo la getc del secondo if non legge lo stesso carattere del primo if giusto? Ma legge il successivo, è corretto? Per fargli leggere lo stesso caratte dovrei mettere una ungetc prima del secondo if ... ditemi se sbaglio!!

andbin
04-04-2007, 17:09
Ora io mi chiedo la getc del secondo if non legge lo stesso carattere del primo if giusto? Ma legge il successivo, è corretto?Esatto, sono 2 letture diverse.
Per fargli leggere lo stesso caratte dovrei mettere una ungetc prima del secondo if ... ditemi se sbaglio!!Però nel codice hai fatto un else if. Vuol dire che se il primo carattere è '#' il secondo if non viene nemmeno testato. Al contrario, se il primo carattere non è '#', allora non entri nel primo blocco (quindi non potresti fare neanche una ungetc) ma passi al secondo getc.

La soluzione migliore è 1 sola lettura e poi la catena di if (o uno switch, per es.).

c = getc (....);

if (c == .....) { ... }
else if (c == .....) { ... }
.....

Tyler Darden
04-04-2007, 17:21
Grazie del chiarimento ... faro proprio come dici te!!
Ciaooo

Tyler Darden
05-04-2007, 15:45
Supponiamo che abbia un ciclo while così fatto:

while((c = getc(ptr->file)) != '#' || (c = getc(ptr->file)) != '*'){

...
...

codice

...
...

}

La getc viene ripetuta due volte anche in questo caso anche se c'è un OR giusto? So che è molto simile all'esempio precedente, ma voglio essere solo sicuro.

Anche in questo caso dovrei fare prima una letteura con getc e poi confrontare il carattere letto.

Ciao

beppegrillo
05-04-2007, 15:49
Non viene ripetuta due volte, l'or è vero anche se solo una delle due è condizioni è vera.
Se nel caso la prima fosse vera, il compilatore non si preoccupa di controllare che sia vera anche la seconda, ma esegue direttamente il blocco del codice.

Tyler Darden
05-04-2007, 15:54
ok ...
ma se invece è vera la seconda la prima l'ha pur sempre letta ... o no?

andbin
05-04-2007, 16:05
ok ...
ma se invece è vera la seconda la prima l'ha pur sempre letta ... o no?La OR || ha il comportamento "short-circuit". In A || B se A è vero allora B non viene valutato. Se A è falso allora B viene valutato.

sirus
05-04-2007, 22:23
Se però A è falso allora viene valutato anche B il che provoca 2 letture da file e non una.
La soluzione potrebbe essere:while((c = getc(fptr)) != '#' || c != '*') {
...
}
in questo caso si eseguirebbe sempre e comunque una sola lettura. ;)