Newsgroup: it.comp.lang.c
Titolo: Aiuto C

Chi può aiutarmi ?
Essendo alle prime armi con il Linguaggio C ho acquistato come testo
LINGUAGGIO C (ANSI C) - BRIAN W. KERNIGHAN - DENNIS M. RITCHIE
della Jackson Libri e a pag.16 del manuale ho trovato come
codice :
#include <stdio.h>
main()
{ 
  int c;
 
  c = getchar() ;
  while(c != EOF)
  { putchar(c) ;
    c = getchar() ;
  }
}
/*il programma copia l'input sull'output*/
ma ciò che significa ?
il risultato parrebbe indifferente se il codice fosse (lo suppongo io) :
#include <stdio.h>
main()
{ 
  int c;
  c = getchar() ;
}
il carattere compare sempre sullo schermo anche se non vi è putchar(c) ,
quale significato dunque avrebbe tale comando in questo programma?
2° provate a compilarlo :
 in teoria dovrebbe rendere il dato in entrata dalla tastiera in uscita
 su video , quindi io provo 
       pigio 1 compare 1
       pigio 2 compare 2
       .................
       pigio a compare a
       etc.....
 la condizione di uscita dal ciclo WHILE è che (c != EOF)
 ma cos'è questo End Of File un tasto in particolare ?
 (ma non credo , comunque non riesco a capirlo)
come dunque va interpretata la frase del testo :
"...il problema consiste nel distinguere la fine dell'input dai
dati validi.La soluzione è data dal fatto che getchar ,quando 
non c'è più input ,ritorna un valore particolare che non può essere
confuso con alcun altro carattere reale .Questo valore è chiamato 
EOF..."  
Se potete consigliatemi anche qualcosa sul Web : una guida , o un manualetto.
grazie NeMo

  ma cos'è questo End Of File un tasto in particolare ?
Si. In DOS si ottiene premendo CTRL-Z.
EMG

Caro ReVeNgEr,
vedrò di risponderti come posso,
del resto anch'io sono un novellino.
EOF è una costante simbolica definita nel file
"stdio.h" tramite la direttiva al preprocessore "#define",
se apri il file stdio.h con un editor lo puoi facilmente trovare.
Se non sbaglio ai compilatori non è prescritto il valore
che deve assumere tale costante, anche se quasi sempre
vale "-1" (come ad es. per la Borland), in ogni caso il valore
non conta.
EOF viene restituito da funzioni di i/o quando viene raggiunto un segnale
di "fine file" nello "stream" dei dati: nel tuo caso ciò corrisponde a
quando
da tastiera viene introdotto ^Z (cioè quando premi CTRL+Z).
Il codice che riporti come esempio non è equivalente a quello che
hai poi riscritto tu;
il programma originale entra in un ciclo e continua a leggere dati da
tastiera finché non premi ^Z ed ha come effetto di visualizzare
ciò che hai digitato solo dopo che hai premuto RETURN, non
immediatamente dopo aver digitato un carattere, quindi non capiterà che:
pigio 1 vedo 1
pigio 2 vedo 2
ma :
pigio 1 pigio 2 pigio 3 pigio RETURN( cioè INVIO)
vedo 123
cioè il buffer di i/o viene scaricato sul video solo dopo RETURN,
apposta per mettere in evidenza il fatto che, anche se la putchar segue
immediatamente getchar, non si ha direttamente la visualizzazione
sul video, perché le due funzioni operano sullo "stream", mentre la
gestione del video avviene a "buffer".
Invece il programmino che hai scritto tu non fa nient'altro
che leggere un carattere ed assegnarlo a "c".
Mah, sarò stato chiaro ???
Ho un po' di dubbi...
Ciao
Roberto

you wrote :
#Chi può aiutarmi ?
#/*il programma copia l'input sull'output*/
#
#ma ciò che significa ?
#il risultato parrebbe indifferente se il codice fosse (lo suppongo io) :
Il C, riprendendo la filosofia di Unix, interpreta l'input e l'output
come file. Quindi anche la tastiera e' un file (stdin) per il C, cosi'
come il video (stdout). Entrambi, pero', possono essere reindirizzati
verso file veri e propri.
Se non c'e' reindirizzamento di stdin verso un file, viene assunta per
default la tastiera ; se non c'e' reindirizzamento di stdout verso un
file, viene assunto per default il video.
getchar() e putchar() non sono altro che macro riscritte come
getc(stdin) e putc(stdout) e quindi leggere e scrivere con queste due
funzioni equivale a leggere e scrivere da/su un file.
#  c = getchar() ;
#il carattere compare sempre sullo schermo anche se non vi è putchar(c) ,
#quale significato dunque avrebbe tale comando in questo programma?
L'operazione di putchar() non e' quella di "visualizzare" il
carattere, ma di mandarlo verso l'output.
In questo caso non c'e' evidentemente reindirizzamento di stdout e
quindi il carattere compare a video, in quanto per default viene
assunto il video come stdout, ma nel caso stdout fosse associato a un
file, il carattere verrebbe scritto su quel file da putchar().
# la condizione di uscita dal ciclo WHILE è che (c != EOF)
# ma cos'è questo End Of File un tasto in particolare ?
# (ma non credo , comunque non riesco a capirlo)
End of File viene riconosciuto automaticamente nel caso di un file su
disco, ovvero nel caso stdin fosse reindirizzato su esso, ma in questo
caso, non essendoci reindirizzamento, stdin corrisponde alla tastiera
la quale potrebbe fornire un flusso di dati pressoche' infinito e
quindi va impostato manualmente l'EOF dall'utente, a seconda del
sistema operativo utilizzato (sotto DOS tramite la pressione di Ctrl+Z
oppure F6).
#come dunque va interpretata la frase del testo :
#"...il problema consiste nel distinguere la fine dell'input dai
#dati validi.La soluzione è data dal fatto che getchar ,quando 
#non c'è più input ,ritorna un valore particolare che non può essere
#confuso con alcun altro carattere reale .Questo valore è chiamato 
#EOF..."  
Se ci fai caso il tipo ritornato da getchar() non e' char, come ci si
aspetterebbe, ma int.
Questo vuol dire che e' stato adottato un tipo di dati che ha un range
numerico superiore del char, per restituire, presumibilmente, valori
che hanno un significato particolare, come ad esempio EOF.
La EOF e' una costante (che qualche volta puo' valere -1) e viene
restituita da getchar() quando essa incontra la fine del file.
Il programma ricevera' tutti i caratteri dall'input e getchar() ne
restituira' il valore numerico (secondo il codice di caratteri
adottato dal sistema, presumibilmente ASCII) ma quando essa incontra
la fine del file restituira' il valore di EOF ed il programma sapra'
che la lettura e' terminata. 
........................................................
. Andrea Laforgia        (
andrea_...@bigfoot.com
) .
........................................................

you wrote :
#il programma originale entra in un ciclo e continua a leggere dati da
#tastiera finché non premi ^Z ed ha come effetto di visualizzare
#ciò che hai digitato solo dopo che hai premuto RETURN, non
No, attenzione : i caratteri vengono visualizzati *come eco* quando si
premono i tasti, mentre vengono visualizzati *come output* quando si
preme RETURN.
Non e' vero, cioe', che non compaiono a video mentre si digitano.



Sì, certo,
grazie per l'appunto così preciso !
In realtà ho dato per scontato la visualizzazione come
*eco* ed ho espresso in modo equivoco il concetto.
Grazie.
Roberto
