[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Problema con Debian y la programación



Sindo wrote:
El 23/10/07, Luis Rodrigo Gallardo Cruz <rodrigo@nul-unu.com> 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/




Reply to: