| Ver tema anterior :: Ver siguiente tema |
| Autor | Mensaje |
|---|
Wellingtom

Registrado: 19 Sep 2007 Mensajes: 17 Ubicación: venezuela
| Publicado: 05/10/2007 8:32 pm | | | Título: ¿para que sirve la funcion fflush( stdout ); ? |
| es que nunca me funciona... bueno, no es que nunca me funcione, es que no se para que sirven... leí la info que hay en el curso, pero no entendí... y, puedo, escribirle otro parametro? (en vez de stdout) ? _________________ o sea hello! |
|
| Volver arriba | |
 |
rir3760

Registrado: 01 Oct 2004 Mensajes: 3588 Ubicación: Mexico
| Publicado: 06/10/2007 7:40 am | | | Título: |
| Cuando se utiliza un stream de texto (abierto usualmente mediante la funcion fopen) los datos que se envian no necesariamente llegan directamente al dispositivo (pantalla, archivo, etc.), en su lugar (y por eficiencia) los datos permanecen en un area de almacenamiento temporal o bufer. Solo cuando el bufer de datos se llena es cuando se envian a menos que ocurra una situacion especial que indique que los datos deben enviarse sin importar la cantidad de estos en el bufer.
Una analogia con la vida real seria un sistema de paqueteria local que transfiere paquetes (nuestros datos o caracteres) mediante una camioneta de reparto (nuestro stream). Llevar cada paquete a su destinatario conforma llega no seria eficiente, en su lugar es mejor almacenar los paquetes en la bodega (bufer) y una vez que esta se llene pasar todos los paquetes a la camioneta (vaciar el bufer) y enviarlos (todos a la vez) a su destino.
----
En lo que respecta a los "casos especiales": uno de estos casos ocurre cuando una linea de texto enviada termina con el caracter de fin de linea o '\n', por ejemplo en este caso se envia una cadena a la salida estandar (usualmente la pantalla):
| Código: | printf("hola, mundo\n"); |
Aqui no hay problema porque los datos finalizan con el caracter mencionado y esto hace que los datos pasen directamente a la salida estandar.
Por otra parte si tenemos esto:
| Código: | int numero;
/* ... */
/* 1 */ printf("Dame el numero: "); /* 2 */ scanf("%d", &numero); /* 3 */ printf("El numero introducido es %d\n", numero); |
Debido al uso del bufer las llamadas a funcion pueden no producir el efecto esperado. Para explicarlo mejor:
1) En la linea 1 se envia una cadena pero como esta no termina en '\n' se almacena en el bufer de la salida estandar, el punto aqui es que esa cadena todavia no se presenta en pantalla.
2) La llamada a scanf resulta en la detencion del programa mientras se introduce un numero en la entrada estandar (usualmente el teclado) y es procesado. Si el numero es 10 lo que veriamos en una consola seria:
3) En esta llamada a printf la cadena termina con '\n' por lo que los datos en el bufer (la cadena del paso 1) se envian a la salida estandar y a continuacion se envia la cadena "El numero introducio es 10":
| Código: | 10 Dame el numero: El numero introducido es 10 |
Como puedes ver el problema en este ejemplo es una aparente falta de sincronia cuando se llama a las funciones ya que primero se pide el dato y solo despues de esto se presenta el mensaje de instrucciones o "prompt".
Para evitar esto tendriamos que terminar con '\n' la cadena del paso 1 o bien indicar explicitamente que los datos (los que sean) en el bufer de la salida estandar (stdout) se envien, esto lo hacemos con la llamada a funcion fflush(stdout), el argumento de esta funcion indica el stream cuyo bufer debe vaciarse.
El ejemplo anterior corregido seria asi:
| Código: | int numero;
/* ... */
/* 1 */ printf("Dame el numero: "); /* 2 */ fflush(stdout); /* 3 */ scanf("%d", &numero); /* 4 */ printf("El numero introducido es %d\n", numero); |
Y su salida en caso de que el numero introducido sea 10 seria:
| Código: | Dame el numero: 10 El numero introducido es 10 |
Por ultimo esta funcion solo puede utilizarse con streams de salida como la salida estandar (stdout), la salida estandar de errores (stderr) y los archivos abiertos en modo escritura. Para streams de entrada no es valido aunque algunos compiladores soportan (como extension) la forma fflush(stdin) que elimina el contenido del bufer de la entrada estandar (stdin, usualmente el teclado).
Un saludo _________________ The capacity to learn is a gift; The ability to learn is a skill; The willingness to learn is a choice. -- Rebec of Ginaz |
|
| Volver arriba | |
 |
Wellingtom

Registrado: 19 Sep 2007 Mensajes: 17 Ubicación: venezuela
| Publicado: 06/10/2007 8:52 am | | | Título: |
| valla! gracias...!!! aunque no conozco la funcion fopen...xD _________________ o sea hello! |
|
| Volver arriba | |
 |
|
Wellingtom

Registrado: 19 Sep 2007 Mensajes: 17 Ubicación: venezuela
| Publicado: 06/10/2007 6:19 pm | | | Título: |
| pero de todas formas, a mi nunca me funciona esa funcion fflush. _________________ o sea hello! |
|
| Volver arriba | |
 |
rir3760

Registrado: 01 Oct 2004 Mensajes: 3588 Ubicación: Mexico
| Publicado: 06/10/2007 9:36 pm | | | Título: |
| Decir simplemente que algo no funciona no es de mucha ayuda, mejor indicanos que te llevo a esa conclusion y si se trata de un programa muestranos el codigo fuente de este.
Un saludo _________________ The capacity to learn is a gift; The ability to learn is a skill; The willingness to learn is a choice. -- Rebec of Ginaz |
|
| Volver arriba | |
 |
Wellingtom

Registrado: 19 Sep 2007 Mensajes: 17 Ubicación: venezuela
| Publicado: 07/10/2007 8:28 pm | | | Título: hello. |
| buenas noches, hello!!
rir3760, me llevó a esa conclusión, que cuando un codigo me funciona (usando fflush (stdout); ) todo bien... pero despues, lo quito, y sigue funcionando bien...
y si sin usarlo, me sale mal (un codigo) lo pongo (fflush(stdout); ), y sigue saliendome mal...
es decir, por eso digo que no le veo utilidad, por supuesto, no digo que no sirva, es que a mi siempre me salen las cosas diferentes que a todos los demas...
 _________________ o sea hello! |
|
| Volver arriba | |
 |
|
rir3760

Registrado: 01 Oct 2004 Mensajes: 3588 Ubicación: Mexico
| Publicado: 08/10/2007 6:59 am | | | Título: Re: hello. |
| | Wellingtom escribió: | me llevó a esa conclusión,
que cuando un codigo me funciona (usando fflush (stdout); ) todo bien... pero despues, lo quito, y sigue funcionando bien...
y si sin usarlo, me sale mal (un codigo) lo pongo (fflush(stdout); ), y sigue saliendome mal... |
El problema es que seguimos en lo mismo: si un programa simplemente "no funciona" esto puede deberse a muchas cosas y te aseguro que en tu caso no es debido al uso de fflush(stdout) ya que si lo fuera el agregar (o en su caso eliminar) la llamada a funcion resolveria el problema.
Para corregir el error que mencionas habria que revisar el codigo fuente del programa.
Un saludo _________________ The capacity to learn is a gift; The ability to learn is a skill; The willingness to learn is a choice. -- Rebec of Ginaz |
|
| Volver arriba | |
 |
|
|