Foros del Web » Programación para mayores de 30 ;) » C/C++ »

duda simple con fflush

Estas en el tema de duda simple con fflush en el foro de C/C++ en Foros del Web. Buenas, hace unos pocos días empese con C y me tope con una duda @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código C: Ver original #include <stdio.h>   int main ...
  #1 (permalink)  
Antiguo 21/09/2012, 14:30
 
Fecha de Ingreso: junio-2009
Mensajes: 84
Antigüedad: 14 años, 9 meses
Puntos: 2
duda simple con fflush

Buenas, hace unos pocos días empese con C y me tope con una duda

Código C:
Ver original
  1. #include <stdio.h>
  2.  
  3. int main(){
  4.     char ch1, ch2;
  5.     printf("Ingrese 1: ");
  6.     scanf("%c",&ch1);
  7.     printf("Ingrese 2: ");
  8.     fflush(stdin);
  9.     scanf("%c",&ch2);
  10.     printf("%c %c\n", ch1, ch2);
  11.  
  12.     return 0;
  13. }
Pero lo que resulta es q al ingresar el primer carácter ch1, automáticamente se salta el 2º scanf con exactamente el mismo carácter q introduje en el 1º scanf.

Se supone que eso debería solucionarse con fflush, pero es exactamente el mismo resultado. No le puse luego antes del 1º scanf, puesto q se supone q el buffer de entrada debería estar limpia, aun poniéndole es lo mismo

Alguien me podría decir en q estoy fallando?
  #2 (permalink)  
Antiguo 21/09/2012, 15:15
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 11 años, 8 meses
Puntos: 83
Respuesta: duda simple con fflush

Pues a mi me funciona tal como está; lo unico que veo es que tal vez el fflush deberia estar asociado a scanf, es decir, haces un scanf y, cuando ya no necesitas los datos del bufer de entrada, lo vacias antes de enviar nuevos datos por salida (creo que no afecta al flujo de datos, es solo cuestion de reorganizar las instrucciones). No será que pinchas la misma tecla dos veces :) ?

Código:
#include <stdio.h>
     
int main() {
    char ch1, ch2;
    
    printf("Ingrese 1: ");
    scanf("%c", &ch1);
    fflush(stdin);
    
    printf("Ingrese 2: ");
    scanf("%c", &ch2);
    fflush(stdin);
    
    printf("%c %c\n", ch1, ch2);
    
    //getchar();
    return 0;
}
vosk
  #3 (permalink)  
Antiguo 21/09/2012, 15:51
 
Fecha de Ingreso: junio-2009
Mensajes: 84
Antigüedad: 14 años, 9 meses
Puntos: 2
Respuesta: duda simple con fflush

Pues no me funciona aun con lo que me dejaste, será por una pifia del compilador gcc de la terminal de Ubuntu? 12.04

Hay algunos otros métodos que también sirva para eliminar limpiar el buffer?
  #4 (permalink)  
Antiguo 21/09/2012, 16:06
Avatar de L3m0n  
Fecha de Ingreso: diciembre-2011
Mensajes: 219
Antigüedad: 12 años, 3 meses
Puntos: 46
Respuesta: duda simple con fflush

NO USEIS FFLUSH(STDIN)! Es una funcion que no es estandard y no debe usarse ya que solo funcionara en algunos lugares, concretamente en windows. La funcion fflush(stdin) no funciona en linux, ya que la funcion fflush solo sirve para flujos de salida (fflush(stdout)) y no para flujos de entrada.

Aun no entiendo la mania que tienen muchos libros en explicarlo asi pero vamos.

Lo siento si me exalto mucho pero es que es un error que mucha gente que comienza hace simplemente porque no se les ha enseñado la forma correcta de hacerlo.


Saludos.
  #5 (permalink)  
Antiguo 21/09/2012, 19:17
 
Fecha de Ingreso: junio-2009
Mensajes: 84
Antigüedad: 14 años, 9 meses
Puntos: 2
Respuesta: duda simple con fflush

Recién estuve leyendo que stdin es una función extra q se le dieron a algunos compiladores, entonces... como uno puede asegurar que lo que uno estudie sea Standar de C?

Cuál sería la forma correcta de limpiar el buffer de entrada?

PD: para evitar estos problemas, existe librerias de C que uno pueda revisar y estudiar sus funciones, por ejemplo, Sun publicó la API de Java en la web Oficial

Existirá lo mismo para C? que la empresa (sea quien sea que haya inventado C) tenga publicada la API de C para ver sus metodos, etc, etc?
  #6 (permalink)  
Antiguo 22/09/2012, 05:55
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 11 años, 8 meses
Puntos: 83
Respuesta: duda simple con fflush

Ok L3m0n tiene toda la razon, aun asi el uso bajo windows es bastante comun aun cuando lo recomendable sea usar funciones de la API del sistema; no obstante si en el manual de Gaudy sale el ejemplo no esta de mas probarlo no? (eso si, lee la letra pequeña, no sea que ponga que no sirve para linux)

Por si acaso no has encontrado ninguna solucion, esta es la que parece mas fiable:

Código:
//en vez de llamar a fflush lanzas este bucle
while((ch = getchar()) != '\n' && ch != EOF);
(por ahi encontraras también la version para c++ con cin.get() como traduccion del getchar). La razon de este comportamiento puedes encontrarla en cualquier manual de referencia de C (copio y pego, esta en ingles):

Código:
int fflush(FILE *ostream);

ostream points to an output stream or an update stream in which the
most recent operation was not input, the fflush function causes any
unwritten data for that stream to be delivered to the host environment to
be written to the file; otherwise, the behavior is undefined.
La explicacion es clara, solo es fiable para flujos de salida.


"...que la empresa (sea quien sea que haya inventado C)..."
Solo a modo de comentario, parece ser que C fue desarrollado por Dennis M. Ritchie en Bell Labs, y puedes encontrar el manual de referencia por ejemplo aquí [URL="http://www.gnu.org/software/libc/manual/html_mono/libc.html"]http://www.gnu.org/software/libc/manual/html_mono/libc.html[/URL] (que por cierto no comenta lo del fflush)

nota: todo el contenido de este post puedes encontrarlo en altavista :)

Saludos
vosk
  #7 (permalink)  
Antiguo 22/09/2012, 07:33
 
Fecha de Ingreso: septiembre-2012
Mensajes: 3
Antigüedad: 11 años, 7 meses
Puntos: 0
Pregunta Respuesta: duda simple con fflush

existe alguna otra solucion para el fflush? ya que tengo el mismo problema. A mi especificamente me piden q use el fflush en el enunciado del ejercicio.
  #8 (permalink)  
Antiguo 22/09/2012, 20:33
 
Fecha de Ingreso: agosto-2012
Mensajes: 94
Antigüedad: 11 años, 8 meses
Puntos: 7
Respuesta: duda simple con fflush

Es increible que te pidan que uses FFlush. Es un libro o algo de la universidad? Si es la universidad, haslo con fflush, pero recuerda. (Con fflush esta mal), y cuando programes algo diferente a ese ejercicio, hazlo con el bucle while , con ese bucle, se fija si en el buffer hay un /n o un End of File y en ese caso, continua, sino, sigue sacando caracter por caracter. Tecnicamente, es imposible que falle, aunque yo tampoco entiendo a veces porque aparecen problemas con el buffer si uno no toca tecla alguna antes de un scanf.

Saludos!
  #9 (permalink)  
Antiguo 23/09/2012, 20:35
 
Fecha de Ingreso: junio-2009
Mensajes: 84
Antigüedad: 14 años, 9 meses
Puntos: 2
Respuesta: duda simple con fflush

Gracias vosk, aunq es un poco curioso ese While, como se supone q funciona un while sin cuerpo?? es como una sentecia if??
  #10 (permalink)  
Antiguo 24/09/2012, 07:29
Avatar de L3m0n  
Fecha de Ingreso: diciembre-2011
Mensajes: 219
Antigüedad: 12 años, 3 meses
Puntos: 46
Respuesta: duda simple con fflush

No tiene cuerpo porque simplemente no necesitamos que haga nada, me explico.

Lo que hace el while es decir mientras coja un caracter diferente de '\n' y EOF hacer "algo", como ese "algo" es nada pues pasa a la condicion otra vez, y asi hasta que se ha vaciado el buffer.


Saludos.
  #11 (permalink)  
Antiguo 24/09/2012, 11:43
 
Fecha de Ingreso: agosto-2012
Mensajes: 94
Antigüedad: 11 años, 8 meses
Puntos: 7
Respuesta: duda simple con fflush

Pero, por las dudas, no hay que ponerle una llave de apertura y de cierre, , algo asi;

{;}

para que no tome la linea siguiente?

al menos eso creo, o no?

Saludos!!
  #12 (permalink)  
Antiguo 24/09/2012, 14:05
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 11 años, 8 meses
Puntos: 83
Respuesta: duda simple con fflush

El punto y coma indica final de instruccion; puedes poner llaves de apertura y cierre sin nada dentro, pero deberas indentarlo correctamente, es decir que te llevara tres lineas de codigo (esto no afecta al programa, pero si tenemos que hacerlo es mejor hacerlo bien :) )

Gaudy: el while sin cuerpo funciona tal como bien ha explicado L3m0n. No es como un simple if, sino como una serie de ifs, o mejor dicho es como una funcion recursiva.

Saludos
vosk
  #13 (permalink)  
Antiguo 26/09/2012, 05:40
 
Fecha de Ingreso: junio-2010
Ubicación: Madrid
Mensajes: 620
Antigüedad: 13 años, 10 meses
Puntos: 73
Respuesta: duda simple con fflush

Cita:
Recién estuve leyendo que stdin es una función extra q se le dieron a algunos compiladores, entonces... como uno puede asegurar que lo que uno estudie sea Standar de C?
stdin y stdout no son funciones extra que se añadieron a algunos compiladores. Simplemente, son los nombres para los dispositivos de entrada/salida estándar (teclado y pantalla), y existen en todos los compiladores C. Así, es lo mismo poner, por ejemplo, scanf(...) que fscanf(stdin, ...), o printf(...) que fprintf(stdout, ...).
  #14 (permalink)  
Antiguo 26/09/2012, 13:00
 
Fecha de Ingreso: agosto-2012
Mensajes: 94
Antigüedad: 11 años, 8 meses
Puntos: 7
Respuesta: duda simple con fflush

STDIN es simplemente la entrada estandar. Ni siquiera es una funcion. FFLUSH es una funcion que controla flujos de salida (y me gustaria saber excactamente para que sirve)

Etiquetas: int, simple
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 14:21.