Discussion:
getchar()
(demasiado antiguo para responder)
Olaf "El Blanco"
2005-10-03 11:47:39 UTC
Permalink
Una tonta pregunta....

#include <stdio.h>
main()
{
int caracter = 0;
while ((caracter = getchar()) != EOF) {
printf ("%c", caracter);
return(0);
}

Cuando ejecuto esto y presiono enter me devuelve todo lo que escribí...
¿donde se guardó toda esa información?
Me imagino que son bytes de cada tecla... Porque si en vez de %c le pongo %d
me imprime los ASCII respectivos....
Y todo eso es mucho para tenerlo en una simple variable entera...

Pregunto esto porque no puedo hacer un ejercicio que expongo en el anterior
mensaje...
McLeod / IdeaFix
2005-10-03 12:13:25 UTC
Permalink
Post by Olaf "El Blanco"
Cuando ejecuto esto y presiono enter me devuelve todo lo que escribí...
¿donde se guardó toda esa información?
getchar, putchar, etc... usan a la entrada estandar y salida estandar
como ficheros con buffer. El buffer lo pone el sistema operativo y sirve
para acerlerar los accesos a disco. Me explico: con E/S por buffer, tú
no escribes directamente a disco, o lees directamente *siempre* a disco:
la primera lectura, por supuesto que sí se hará de disco, pero el S.O.
leerá más de lo que tú necesitas, y el resto lo guarda en un buffer
(cuesta lo mismo para el S.O. leer un byte de fichero que leer,
digamos... 512). Las subsiguientes lecturas las hará de ese buffer en
memoria, con lo que serán mucho más rápidas. Todo esto es transparente
para el programador.

En escritura pasa igual: un printf o un putchar no escriben YA a la
pantalla, sino que lo hacen en el buffer de escritura asociado a ese
fichero. Sólo cuando el buffer se llena, o bien se cierra el fichero, o
bien explicitamente se ordena, el buffer se vacía y el resultado en este
caso, se muestra en pantalla. Este comportamiento es más notorio en UNIX
que en MS DOS o Windows.

En tu programa...

#include <stdio.h>
main()
{
int caracter = 0;
while ((caracter = getchar()) != EOF)
printf ("%c", caracter);
return(0);
}

... al pulsar Enter, se guarda en "caracter" y justo después es mostrado
en el printf. Normalmente, el caracter "enter" indica al buffer de
salida que debe volcar sus datos al fichero (en este caso pantalla).

Si quieres que cada cosa que se escriba, aparezca inmediatamente a
continuación, en lugar de guardarse en el "dichoso" buffer, simplemente
haz esto:

#include <stdio.h>
main()
{
int caracter = 0;
while ((caracter = getchar()) != EOF)
{
printf ("%c", caracter);
fflush (stdout);
}
return(0);
}

fflush() fuerza a que se vacíe el buffer asociado al descriptor de
fichero que toma como parámetro. Al vaciarse, sus contenidos pasan a
escribirse al fichero de salida, en este caso "stdout" (la salida estándar).
Antoine Leca
2005-10-04 10:48:08 UTC
Permalink
Post by McLeod / IdeaFix
Post by Olaf "El Blanco"
Cuando ejecuto esto y presiono enter me devuelve todo lo que
escribí... ¿donde se guardó toda esa información?
getchar, putchar, etc... usan a la entrada estandar y salida estandar
como ficheros con buffer.
No creo que tienen mucho que ver. Si las entradas y salidas estándar son
interactivos (no ficheros), se supone que stdin y stdout no tienen buffers
completo a nivel de la biblioteca C. Pero sí pueden tener buffer de linea
(por su parte stderr no lo tindrá).
Post by McLeod / IdeaFix
El buffer lo pone el sistema operativo y sirve para acerlerar los
accesos a disco.
No. Hay (al menos) dos niveles de buffer. Uno lo pone el sistema operativo.
Y otro lo pone la biblioteca C. El segundo se puede quitar utilizando un
sistema de funciones diferentes, open() en vez de fopen y read() en vez de
getc(), pero el programa resulta menos portable (y mucho programas resultan
mucho más lentos.)
Post by McLeod / IdeaFix
while ((caracter = getchar()) != EOF)
{
printf ("%c", caracter);
fflush (stdout);
}
Esto funciona en muchos casos en *nix, pero no vale siempre, por que no
asegura que el buffer de stdin está también vaciado.


Antoine

Antoine Leca
2005-10-04 10:33:52 UTC
Permalink
Post by Olaf "El Blanco"
while ((caracter = getchar()) != EOF) {
Cuando ejecuto esto y presiono enter me devuelve todo lo que
escribí... ¿donde se guardó toda esa información?
En el driver de consola de tu sistema operativo.
De modo normal, el sistema espera al Enter antes de devolver las teclas al
programa. De esta forma puedes corregir tu entrada (con <-- etc.) al
equivocarte. O tecleando Ctrl-Break puedes interrumpir el programa.

Si no lo quieres, hay funciones especificas del sistema para impedir este
(en *nix, este modo se llama COOKED, y el dónde recibes las teclas no más
teclearlas se llama RAW.)
Post by Olaf "El Blanco"
Me imagino que son bytes de cada tecla... Porque si en vez de %c le
pongo %d me imprime los ASCII respectivos....
Por que es lo por qué preguntas con %d (y ASCII es el modo de codificar los
carácteres en tu sistema). En C, los carácteres sont pequeños enteros,
entonces se pueden mirar también como enteros.


Antoine
Loading...