Newsgroup: it.comp.lang.c
Titolo: Valore di EOF

Salve a tutti! :)
Mi trovo a studiare il C per l'uni, il libro che uso mi illustra il
seguente codice:
#include<stdio.h>
/*Copia l'input sull'output;seconda versione */
main(){
    int c;
    while((c=getchar())!=EOF){
        putchar(c);
    }
    system("pause");
}
Il significato del programma è ok, l'unica cosa che quando lo faccio
eseguire non riesco a terminarlo normalmenete.
Infatti per uscire dal ciclo dovrei immetere un valore tale che sia
uguale a EOF; ma a cosa corrisponde il valore di EOF??
Il libro si limita solo a spiegare che si tratta di un valore intero
definito nella libreria stdio.h.
grazie

 grazie

 uguale a EOF; ma a cosa corrisponde il valore di EOF??
EOF rappresenta la fine del file, dunque per interrompere il programma 
devi chiudere il file di input. Da tastiera questo si ottiene (di 
solito) premendo Ctrl-D.
E.

Daniele Nasuti ha scritto:

Il libro è corretto, è un valore (-1) definito all'interno di quello 
header. Tuttavia, non dovresti mai fare riferimento al valore 
diretamente, ma sempre ad EOF, per questioni di portabilità: ti viene 
garantito il ritorno di EOF, qualuqnque valore esso abbia, non di -1.
Ctrl+z e Ctrl+d, non sono EOF, causano la sospensione e l'arresto del 
programma tramite l'invio di signal, che non avendo tu gestito in 
maniera personalizzata, eseguono la loro azione di default (man 7 signal 
se la memoria non mi inganna e le vedi tutte, anche i signal non 
catturabili). Ctrl + Z mette il processo in stop, lo sospende, (sigstop 
mi pare), mentre Ctrl+D è un sigterm.
phempto

 sospende, (sigstop mi pare), mentre Ctrl+D è un sigterm.
Ctrl-D e Ctrl-Z sono il carattere di fine input rispettivamente per 
ambienti Unix e ambienti MSDOS/Windows.  Fisicamente non sono mai 
presenti nei file, anche se alcuni programmi MSDOS lo scrivono.
In ambiente Unix Ctrl-Z (nell'ambito di una shell interattiva) 
significa tipicamente 'suspend' e mette il processo che usa il 
terminale un background.  Start e stop sono rispettivamente Ctrl-Q e 
Ctrl-S.  Ctrl-D è invece end of input.  È invece Ctrl-C che 
normalmente genera il segnale sigterm.  Quelle che seguono sono i 
settaggi tipici di un terminale rilevate dal comando 'stty -a':
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>; 
eol2 = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = 
^W; lnext = ^V;
Altri caratteri di controllo possono essere interpretati dall'editor 
dei comandi della shell se previsto.
Ciao
Giovanni
-- 
   A computer is like an air conditioner,
   it stops working when you open Windows.
   Registered Linux user #337974  < 
http://giovanni.homelinux.net/
 >

 uguale a EOF; ma a cosa corrisponde il valore di EOF??
Se stai leggendo da tastiera, devi digitare CTRL+D o CTRL+Z a seconda che
tu sia, rispettivamente, sotto Linux o Windows. Se stai leggendo da file,
getchar() restituirà EOF, alla prossima lettura, dopo quella dell'ultimo
carattere nel flusso dati di input. Considera che EOF è una costante
dipendente dall'implementazione (equivalente a -1, ad esempio, su molte
piattaforme).
In realtà, non è granché importante che valore abbia questa costante,
purché non sia nel range di caratteri leggibili da getchar() (tipicamente
0..255).
E' per questo che la funzione getchar() non restituisce un char, ma un
int, in modo da avere come indicatore della fine del flusso di dati in
input, un valore al di fuori del range di valori leggibili.
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 comandi della shell se previsto.
Rigrazio Giovanni per aver corretto la baggianata che avevo scritto nel 
post precedente, ma alle 4 del mattino mi ero confuso la C con la D :)
Riguardo Ctrl-Z invece no, è corretto come ho scritto: tramite quella 
combinazione la shell invia un SIGTSTP (SIGnal Tty SToP) al processo,
che eseguendo l'azione di default associata a quel signal, si sospende.
Ciao.
phempto

 input, un valore al di fuori del range di valori leggibili.
Penso che il motivo sia anche che per valori maggiori di 127 i char sono 
molto scomodi da usare. Ad esempio se il char č signed, il byte con 
valore 128 verrebbe convertito nell'intero -128 non appena il carattere 
viene messo in una espressione aritmetica.
E.

 signal, si sospende.
Hai ragione.  Ctrl-Z sospende il processo che poi può essere 
riattivato in foreground col comando 'fg <job_No>' oppure in 
background con 'bg <job_No>'.
È quest'ultimo step che avevo dimenticato dicendo che Ctrl-Z serve per 
mandarlo in background :-(


 molto scomodi da usare. 
?????????????????????????????????


 ?????????????????????????????????
Se fosse
	char getchar();
e vuoi controllare se in un file c'č il byte 0xA0, come fai?
	getchar() == ?
E.

 e vuoi controllare se in un file c'è il byte 0xA0, come fai?
Reset.
Ho capito che vuoi dire ;-)
Mi ha fuorviato quel "per valori maggiori di 127 i char sono molto scomodi
da usare". In realtà, non è propriamente così; sono scomodi da usare sulle
piattaforme in cui il char è signed. Quando il char è unsigned, l'unico
problema è quello che ho spiegato due messaggi fa.



 getchar() == '\xA0'
oppure
 getchar() == (char)0xA0
oppure
 dovevo stare zitto perche' ho scritto solo fesserie :-)
ciao
ilmira