Sindo wrote:
El 23/10/07, Luis Rodrigo Gallardo Cruz <[EMAIL PROTECTED]> escribió:
On Tue, Oct 23, 2007 at 07:24:19PM +0200, Jonay Domingo Ruiz wrote:
Hola lista!!
Me sucede una cosa curiosa con un programa que he tenido que hacer para la
universidad. El programa en cuestión está escrito en ANSI C y lo compilo
con el gcc que viene con Debian. El problema que me surge es con las
funciones de C fflush y fprintf, y es que la función fflush no funciona
bien por alguna razón ya que no me limpia el buffer de stdin como
debería.
Citando a Iñigo Montoya: "I don't think that word means what you think
it means".
fflush *no* tiene por que limpiar el buffer de stdin. Su
especificación dice que
The function fflush() forces a write of all user-space buffered data
for the given output ...
stdin es un flujo de entrada, no de salida.
He ahí el problema. Apuesto a que en tu Etch fflush() está devolviendo
EOF y fijando errno a EBADF. ¡Ay, qué tiempos aquellos en los que se
miraban los valores de vuelta de las funciones!...
La función es esta:
int leerCadena (Tbyte cadena[MAX_CADENA+1])
{ ...
fgets(cadena, MAX_CADENA+1, stdin);
fflush(stdin);
...
}
No hay una forma sencilla de hacer lo que estás intentando. Parte del
problema es que nada te garantiza que stdin esté conectado a un
teclado y que la forma de averiguar si sí no está estandarizada, por
lo que algo que sirva en windows no necesariamente servirá en Linux o en
algún BSD.
Una forma no muy mala de sacarle la vuelta a esto es leer lineas
completas cada vez y luego truncar sólo el pedazo que quieres. Pero
para hacer eso bien necesitas manejar la memoria de forma dinámica.
Otra forma es que investigues sobre la biblioteca ncurses.
Yo descubrí la familia de funciones scanf y desde entonces es la forma
que más me gusta. En tu caso, creo que fscanf sería la más adecuada. Te
permite hacer conversiones (parecidas a la familia printf) y fijar
anchuras máximas de campos en una sola línea (por ejemplo "%10c").
Además, puedes saber cuántos caracteres se han podido convertir ('%n'),
por si necesitas mover el puntero, o descartar datos sin asignarlos.
Estas funciones cumplen el ANSI C. Mira la página del manual como te
indican más abajo para más información.
(...)
Instala el paquete manpages-dev, que contiene la documentación de
todas estas funciones. Una vez que lo tengas
$ man 3 <función>
te dirá todo lo que quieras saber (y un poco más) sobre la función.
(...)
Hola,
yo utilizo la función fflush con Windows y __fpurge con Linux.
(...)
Yo creo que es mejor usar un método estándar y portable siempre que
sea posible. Ahorra código, es más legible y facilita el mantenimiento.
Saludos
--
--
Gabriel Núñez~
-
gabriel.nnl(at)estudiante.uam.es -- gabriel.nunez(at)hispalinux.es
//May The Source Be With You//
--//--
--//-- Infórmese sobre las patentes de software: /-
http://proinnova.hispalinux.es/
http://eupat.ffii.org/
--
To UNSUBSCRIBE, email to [EMAIL PROTECTED]
with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]