Newsgroup: it.comp.lang.c
Titolo: Kerninghan & Ritchie sbagliano?

Ciao, sono un pivellino nella programmazione. Per imparare C ho il libro di
Kerninghan & Ritchie, Linguaggio C, del 1985. Ben presto K&R introducono
EOF, che sarebbe un acronimo per End Of File. Piu' preciusamente, se ne
servono in quei programmini iniziali (pag.14) per contare il numero dei
caratteri, delle linee, etc per intorrempere l'esecuzione del programma.
Dicono che puo' assumere 2 valori, -1 e 0, ma quando eseguo il programma in
una shell non c'e' modo di arrestarlo se non con CTRL+d. E comunque il
programma non fa quello che dovrebbe fare, cioe', ad esempio, contare le
linee di testo digitate.
Tutti i programmi successivi sfruttano EOF, ma K&R non lo definiscono mai
all'inizio con #define. Ovviamente bash compilando restituisce l'errore:
In function 'main':
error: 'EOF' undeclared (first use in this function)
error: (Each undeclared identifier is reported only once
error: for each function it appears in.)
Se dichiaro prima di main() con #define EOF -1 (oppure 0), bash non mi da'
errore in compilazione, ma il programma non fa quello che dovrebbe fare. Ad
esempio
#define EOF -1
main() /* Il programma conta le linee in input */
{
    int c, nl;
    nl = 0;
    while ((c = getchar() != EOF)
        if (c == '\n')
            ++nl;
    printf("%d\n", nl);
}
non conta proprio nulla.
Le mie domande sono: che caspita e' EOF? Come si definisce correttamente?
Perche' K&R non lo definisco mai, neppure in tutti i programmi successivi?
Cosa posso usare in alternativa?
Grazie a chi avra' la pazienza di leggere questo lungo post e mi dara' una
mano.
Niki

 Le mie domande sono: che caspita e' EOF? Come si definisce correttamente?
Prova a compilare con gcc questo programma:
#include <stdio.h>
main() /* Il programma conta le linee in input */
{
     int c, nl;
     nl = 0;
     while ((c = getchar()) != EOF) {
         if (c == '\n')
             ++nl;
     }
     printf("%d\n", nl);
}
EOF = End Of File, si tratta di un carattere particolare che indica che 
si è raggiunta la fine del file, serve per bloccare il programma prima 
che si tenti di leggere qualcosa oltre la fine del file generando quindi 
un errore.
Ciao,
   Luca

 non conta proprio nulla.
a me funziona, una volta corretta la linea del
while a cui manca una parentesi tonda chiusa.
Comunque EOF (e anche printf e getchar) sono
definite in stdio.h quindi cancella pure
il tuo #define e aggiungi un bel
#include<stdio.h>
e per correttezza anche un bel return 0; in fondo
al main.
ciao,
g.

 Perche' K&R non lo definisco mai, neppure in tutti i programmi successivi?
citavi la pag. 14 :)
A pag. 13 dell'edizione italiana:
«...getchar restituisce un valore inconfondibile ... EOF, che sta per
end of file... In concreto EOF è un intero definito in <stdio.h>, ma il
suo valore numerico è rilevante purché non coincida con altri valori di
char...»
dunque se devi usare EOF il tuo programma comincia con
#include <stdio.h>
Lo stesso si dice a pag. 154:
«Il simbolo di costante EOF, definito in <stdio.h>, vale solitamente -1,
ma le condizioni dovrebbero prescindere dal suo valore specifico e
citare solo la forma simbolica EOF.»
Infine a pag 258-259 si parla di <stdio.h>, dicendo che EOF è restituito
da fflush, ecc...
D'inciso,
la riga while del tuo codice dovrebbe essere:
while ( (c=getchar() )  != EOF ) 
/* metto gli spazi per evidenziare il senso delle parentesi */
ciao :)
-- 
salvo

 Perche' K&R non lo definisco mai, neppure in tutti i programmi successivi?
Perche` includono stdio.h