Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: mester en 7 Octubre 2016, 14:29 pm



Título: ¿Por qué es necesario fflush ()?
Publicado por: mester en 7 Octubre 2016, 14:29 pm
Hola.
Tengo el siguiente codigo:
Código
  1. char getch (void) {
  2.  fflush (stdout);
  3.  char buf;
  4.  struct termios old = {0}, new = {0};
  5.  
  6.  if (tcgetattr (STDIN_FILENO, &old) < 0)
  7.    return -1;
  8.  
  9.  new = old;
  10.  
  11.  new.c_lflag &= ~ICANON;
  12.  new.c_cc[VMIN] = 1;
  13.  new.c_cc[VTIME] = 0;
  14.  
  15.  if (tcsetattr (STDIN_FILENO, TCSANOW, &new) < 0)
  16.    return -1;
  17.  
  18.  if (read (STDIN_FILENO, (char *)&buf, 1) < 0)
  19.    return -1;
  20.  
  21.  if (tcsetattr (STDIN_FILENO, TCSANOW, &old) < 0)
  22.    return -1;
  23.  
  24.  return buf;
  25. }
  26.  
  27. int main () {
  28.  printf ("Introduce un caracter\n");
  29.   int a = getch ();
  30. ...
  31. }

No entiendo por qué debo poner fflush despues de haber impreso por pantalla el "Introduce un caracter". Es decir, ¿por qué no lo imprime en primera instancia?

Gracias de antemano.


Título: Re: ¿Por qué es necesario fflush ()?
Publicado por: ivancea96 en 7 Octubre 2016, 15:16 pm
Antes de que los datos sean enviados por el stream de salida (stdout, lo que utiliza printf), son almacenados en un buffer. Del buffer no se envían hasta que ocurre un determinado evento, o hasta que haces un flush.


Título: Re: ¿Por qué es necesario fflush ()?
Publicado por: geeke en 7 Octubre 2016, 16:29 pm
El buffer se vacía si ocurre alguno de estos tres puntos:

1) Cuando el buffer se llena.
2) Si el texto enviado a la salida estándar termina en '\n'.
3) Mediante la llamada a fflush(stdout).

En tu caso se puede omitir la llamada a fflush(stdout) ya que con el salto de linea se vacía el buffer.


Título: Re: ¿Por qué es necesario fflush ()?
Publicado por: mester en 9 Octubre 2016, 20:41 pm
El buffer se vacía si ocurre alguno de estos tres puntos:

1) Cuando el buffer se llena.
2) Si el texto enviado a la salida estándar termina en '\n'.
3) Mediante la llamada a fflush(stdout).

En tu caso se puede omitir la llamada a fflush(stdout) ya que con el salto de linea se vacía el buffer.

¿Y cuando sé que el buffer está lleno? o ¿cómo se su cantidad maxima?


Título: Re: ¿Por qué es necesario fflush ()?
Publicado por: ivancea96 en 9 Octubre 2016, 21:44 pm
En principio el tamaño del buffer no es algo que te deba importar. Él va a trabajar solo. Si tienes urgencia por que salga un mensaje, pon el fflush. Sino, el buffer se suele vaciar solo (generalmente).