Sólo obtendrá un EOF
de la corriente cuando se alcanza el final del archivo, no final de la línea. La forma en que señala un final de archivo depende de su sistema operativo y la configuración del terminal.
Por lo general es CTRLd en los sistemas de tipo UNIX y CTRLz en Windows. Para UNIX en modo cocido (modo de entrada normal), generalmente tendrá que ingresarlo como el primer carácter de una línea y seguirlo con una nueva línea (ENTER).
Con Windows, el CTRLz se puede introducir en cualquier lugar de la línea, pero todavía tiene que ser seguido por un salto de línea.
En UNIX, el carácter real para informar a la interfaz del terminal que desea enviar EOF
se puede establecer con el comando stty
. Si se ejecuta stty -a
, verá algo como:
speed 38400 baud; rows 45; columns 150; line = 0;
intr = ^C; quit = ^\; erase = ^H; kill = ^U; eof = ^D;
eol = <undef>; eol2 = <undef>; swtch = ^Z; start = ^Q;
stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V;
flush = ^O; min = 1; time = 0; -parenb -parodd cs8 -hupcl
-cstopb cread -clocal -crtscts -ignbrk brkint -ignpar -parmrk
-inpck -istrip -inlcr -igncr icrnl ixon -ixoff -iuclc -ixany
-imaxbel opost -olcuc -ocrnl onlcr -onocr -onlret -ofill
-ofdel nl0 cr0 tab0 bs0 vt0 ff0 isig icanon iexten echo
-echoe -echok -echonl -noflsh -tostop -echoctl -echoke
Se puede ver al final de la segunda línea que eof
se establece en ^D
(CTRL d). Puede cambiar esto con:
stty eof ^x
para establecerlo en CTRLx, por ejemplo. También puede configurar una gran cantidad de otras cosas, la mayoría de las cuales harán que su terminal actual no se pueda usar, así que tenga cuidado :-)
En pocas palabras, si desea indicarle a su programa que el archivo está terminado, use CTRLd para UNIX (o comprobar stty
si eso no funciona) o CTRL z para Windows. Si desea obtener sólo una línea de entrada , utiliza el carácter \n
en el código de la siguiente manera:
#include <stdio.h>
int main (void) {
long nc = 0;
while(getchar() != '\n')
++nc;
printf("%ld\n", nc);
return 0;
}
Estoy utilizando Windows y Ctrl + Z es correcto. Gracias, nunca nuevo eso. –
it ** es ** ctrl + z –