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

 

 


Tema destacado: Rompecabezas de Bitcoin, Medio millón USD en premios


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  ¿Queda algo en el Buffer de Entrada stdin? (Solucionado)
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: 1 [2] Ir Abajo Respuesta Imprimir
Autor Tema: ¿Queda algo en el Buffer de Entrada stdin? (Solucionado)  (Leído 5,596 veces)
AlbertoBSD
Programador y
Moderador Global
***
Desconectado Desconectado

Mensajes: 3.705


🏴 Libertad!!!!!


Ver Perfil WWW
Re: ¿Queda algo en el Buffer de Entrada stdin? (Solucionado)
« Respuesta #10 en: 7 Diciembre 2018, 05:49 am »

Tienes razon por alguna razon el fseek no esta procesando la ultima parte del  stdin. Cambie el printf por perror para ver que error marca y dice

Código
  1. if(flagValidacion)
  2. perror("fseek");

Código:
fseek: Invalid argument

Hay que ver el source code de fseek y ver exactamente que parte es la que falla. Y ver si es que de alguna manera el sistema guarda esos bytes saltados, cosas que no creo. Pero hay que revisar.

La otra opcion es lo que comente de revisar el ultimo valor leido por fgets y determinar si queda algo en buffer de entrada. Ejemplo:

Código
  1. #include <stdio.h>
  2.  
  3. void myflush(const char *ptr,int size) {
  4. int i = 0;
  5. while(i < size && ptr[i++] != 0xA);
  6. if(i == size)
  7. while (getchar() != 0xA);
  8. }
  9.  
  10. int main() {
  11. char temp[10];
  12. int flagValidacion ;
  13. while(1) {
  14. printf("> ");
  15. fgets(temp,10,stdin);
  16. myflush(temp,10); // Tiene que ser el ultimo arreglo leido y la ultima cantidad marcada con fgets
  17. printf("cadena: %s\n", temp);
  18. }
  19. }
  20.  

O bien realizarlo con una implementacion propia de fgets que le quite ese "pendiente" al programador. Incluso como un extra le borras al final ese "Enter" si es que existe.

Código
  1. #include <stdio.h>
  2.  
  3. void myfgets_stdin(char *ptr,int size) {
  4. int i = 0;
  5. fgets(ptr,size,stdin);
  6. while(i < size && ptr[i++] != 0xA);
  7. if(i == size)
  8. while (getchar() != 0xA);
  9. else
  10. ptr[i-1] = '\0';
  11. }
  12.  
  13. int main() {
  14. char temp[10];
  15. int flagValidacion ;
  16. while(1) {
  17. printf("> ");
  18. myfgets_stdin(temp,10);
  19. printf("cadena: %s\n", temp);
  20. }
  21. }
  22.  

Saludos



« Última modificación: 7 Diciembre 2018, 07:11 am por AlbertoBSD » En línea

MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: ¿Queda algo en el Buffer de Entrada stdin? (Solucionado)
« Respuesta #11 en: 7 Diciembre 2018, 09:46 am »

stdin no és un archivo de texto al uso. Se ve como archivo por la forma en que UNIX maneja los componentes de la máquina (cómo se ha dicho C se creó para programar UNIX y tiene esas reminiscencias).

stdin es un stream así que no tiene final: se vacía a petición del S.O. pero se llena por circunstancias ajeno a él. De alguna forma siempre se está en el inicio de stdin.

Al decirle a fseek que vaya al final de stdin lo que se hace es ir al final del buffer, entiéndase el final en ese justo momento, pero lógicamente se vuelve a encontrar en su posición inicial listo para llenarse de nuevo con cada nuevo dato que se entre.

Imaginaros una cola se escribe por el final y se lee por el principio. Ahora imaginaros que podéis mover el puntero de lectura con fseek al final. Todo lo que hay al inicio desaparece y la cola aparece vacía.


En línea

Páginas: 1 [2] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines