¿Por qué es necesario fflush ()?

Iniciado por mester, 7 Octubre 2016, 14:29 PM

0 Miembros y 1 Visitante están viendo este tema.

mester

Hola.
Tengo el siguiente codigo:

char getch (void) {
  fflush (stdout);
  char buf;
  struct termios old = {0}, new = {0};

  if (tcgetattr (STDIN_FILENO, &old) < 0)
    return -1;

  new = old;

  new.c_lflag &= ~ICANON;
  new.c_cc[VMIN] = 1;
  new.c_cc[VTIME] = 0;

  if (tcsetattr (STDIN_FILENO, TCSANOW, &new) < 0)
    return -1;

  if (read (STDIN_FILENO, (char *)&buf, 1) < 0)
    return -1;

  if (tcsetattr (STDIN_FILENO, TCSANOW, &old) < 0)
    return -1;

  return buf;
}

int main () {
  printf ("Introduce un caracter\n");
   int a = getch ();
...
}


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.
Justicia es dar a cada uno lo que se merece

ivancea96

#1
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.

geeke

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.

mester

Cita de: 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.

¿Y cuando sé que el buffer está lleno? o ¿cómo se su cantidad maxima?
Justicia es dar a cada uno lo que se merece

ivancea96

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).