elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Curso de javascript por TickTack


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Cuando fgets ensucia el buffer :S
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Cuando fgets ensucia el buffer :S  (Leído 2,596 veces)
nicolasblues86

Desconectado Desconectado

Mensajes: 38



Ver Perfil
Cuando fgets ensucia el buffer :S
« en: 21 Mayo 2010, 00:57 am »

Hola a todos!!

bien recien haciendo unas pequeñas pruebas me di cuenta que en ciertas situaciones fgets con stdin... me ensucia el buffer mas especificamente cuando agrego mas caracteres de los que espera doy un ejemplo

Código
  1.  
  2. #include <stdio.h>
  3.  
  4. int main(int argc, char **argv)
  5. {
  6. char cad[5];
  7.  
  8.  
  9. fgets (cad, sizeof(cad), stdin); //si ingresamos "hola mundo"
  10. puts (cad);                           // imprime "hola"
  11. fgets (cad, sizeof(cad), stdin);// se lo saltea (buffer sucio)
  12. puts (cad);                          // imprime "mun"
  13.  
  14.  
  15. return 0;
  16.  
  17. }
  18.  
  19.  
  20.  


obviamente se puede solucionar haciendo que cad sea mas "grande" como de 120 caracteres, pero quisiera saber alguna manera de no recurrir a eso sino. evitar que el buffer quede sucio....
nada de fflush

EDITADO:
Bueno recién probando encontré que haciendo esto funciona :

Código
  1. setbuf(stdin,NULL);  
  2.  
 
aunque me vuele a que es algo parecido a fflush


espero respuestas, gracias!!!    





« Última modificación: 21 Mayo 2010, 01:08 am por nicolasblues86 » En línea

Solamente hay 10 clases de personas en el mundo los que saben leer binario y los que no
Littlehorse
All the world's a stage
Moderador
***
Desconectado Desconectado

Mensajes: 2.714


Nie Dam Sie


Ver Perfil WWW
Re: Cuando fgets ensucia el buffer :S
« Respuesta #1 en: 21 Mayo 2010, 02:11 am »

No hay una manera estándar de hacer lo que quieres. El acercamiento con fgets es valido porque no ensucia el buffer en inputs correctos, eso no implica que no lo ensucie si el input es incorrecto. Obviamente cabe destacar que scanf ensucia el buffer sea el input correcto o no.

Para explicarlo a grandes rasgos, cualquier tarea I/O de datos pasa a través de diversos estados. En un nivel mas bajo, es el SO (Alguna capa de abstracción para I/O, o como sea que lo implemente el SO determinado) quien se encarga de las interfaces entre los dispositivos, como por ejemplo el teclado, por lo tanto dichos aspectos son inherentes a cada sistema y no pueden abarcarse todos en un estandar. La idea de las funciones de stdio es tener funciones portables que sirvan para las tareas básicas con esos streams de datos, ahora bien, descartar datos de stdin no es una de esas tareas.

fflush con stdin acarrea comportamiento indefinido, el mero hecho que funcione es simplemente porque algunos fabricantes lo implementan para que funcione, y eso indica claramente la carencia de portabilidad. Similar ocurre con setbuf, como bien dijiste, ya que usarlo de esa manera también acarrea comportamiento indefinido.

El mejor acercamiento es o bien usar un buffer lo suficientemente grande para evitar errores no intencionales y validar el input correctamente para evitar otros errores (intencionales o no). También por supuesto otro acercamiento valido es usar las funciones especificas de cada sistema operativo o implementar tus propias funciones.

Una forma bastante precaria para salir del paso en un descarte simple del input seria algo así:

Código
  1. char cad[5],C;
  2. fgets(cad,5,stdin);
  3. puts(cad);
  4. while((C = getchar()) != '\n' && C != EOF)
  5. ;

pero por supuesto para desarrollos serios lo ideal seria usar funciones especificas del sistema o desarrollar tus propias implementaciones de dichas funciones (En caso que requieras un control mas estricto del manejo de datos)

Saludos!


En línea

An expert is a man who has made all the mistakes which can be made, in a very narrow field.
nicolasblues86

Desconectado Desconectado

Mensajes: 38



Ver Perfil
Re: Cuando fgets ensucia el buffer :S
« Respuesta #2 en: 21 Mayo 2010, 02:16 am »

 ;-)  OK!! :D
mil gracias por aclararme las dudas..

Saludos Cordiales
En línea

Solamente hay 10 clases de personas en el mundo los que saben leer binario y los que no
Littlehorse
All the world's a stage
Moderador
***
Desconectado Desconectado

Mensajes: 2.714


Nie Dam Sie


Ver Perfil WWW
Re: Cuando fgets ensucia el buffer :S
« Respuesta #3 en: 21 Mayo 2010, 02:18 am »

De nada, para eso estamos  :D.

Saludos!
En línea

An expert is a man who has made all the mistakes which can be made, in a very narrow field.
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Problema con fgets
Programación C/C++
P.AGCD 3 3,690 Último mensaje 14 Julio 2011, 20:41 pm
por kiriost
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines