C: Problema con fflush

He usado la búsqueda pero no he encontrado la solución, así que recurro a vosotros.

Es para una práctica. En clase usamos un HP-UX y me va bien, pero en mi casa (Linux normalillo) parece que los fflush(stdin) no hacen nada.

Por ejemplo, el siguiente código:
   printf("Nombre del fichero: ");
   scanf("%s", cad);
   fflush(stdin);
   do{
      printf("Modo (LECT/ESCR): ");
      fgets(mod, 5, stdin);
      fflush(stdin);
   } while (strcmp(mod,"LECT")!=0 && strcmp(mod,"ESCR")!=0);


En la universidad, el resultado sería:
Nombre del fichero: datos.dat
Modo (LECT/ESCR): LECT
Y mostraría el menú en espera de elegir una opción.

Pero en mi linux resulta:
Nombre del fichero: datos.dat
Modo (LECT/ESCR): Modo (LECT/ESCR): LECT
Y después me muestra el menú 2 veces ya que el fflush no ha vaciado la entrada y se introduce una opción no válida.

Me sucede todas las veces que pido entrada por stdin y los recojo ya sea con scanf, fgets u otros y, después, hago un fflush(stdin).

No entiendo muy bien cuál puede ser el problema. He probado a cambiar de terminal y nada, gnome-terminal, xterm, etc..

He estado buscando y he leído algo acerca de fpurge, pero también que "Linux may not support fpurge." y está en lo cierto, no está en stdio.h.

En fin, a ver si me podéis ayudar, me estoy volviendo mono con esto y no puedo avanzar las prácticas en mi casa y son muy largas.

Un saludo.

Edito:

Me olvidaba, una forma en que funciona es sustituir los fflush(stdin) por "while(getchar()!='\n');", pero no me parece la forma más adecuada y no sé si funcionaría también en el HP-UX, aunque si no hay otra, podría reemplazar el código sólo en mi casa, bendito "buscar y reemplazar".
La historia es que scanf mantiene el \n en el buffer y es lo primero que lee 'fgets'. Lo más simple es hacer un getc tras el scanf y comprobar si es un \n, si lo es, seguir, si no lo es, ungetc.

De todos modos, lo más simple es usar scanf o fgets consistentemente.

BTW: POSIX dice que fflush solo tiene efecto sobre flujos de lectura.

- ferdy
Muchas gracias Ferdy, entendido y solucionado.
Tras leer mi propio mensaje, me doy cuenta de que he metido el gambón. fflush solo tiene efecto sobre flujos de SALIDA (es decir, de escritura).

Perdón por el desliz.

- ferdy
3 respuestas