¿Queda algo en el Buffer de Entrada stdin? (Solucionado)

Iniciado por AlbertoBSD, 24 Noviembre 2018, 18:54 PM

0 Miembros y 1 Visitante están viendo este tema.

AlbertoBSD

#10
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

if(flagValidacion)
perror("fseek");


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:


#include <stdio.h>

void myflush(const char *ptr,int size) {
int i = 0;
while(i < size && ptr[i++] != 0xA);
if(i == size)
while (getchar() != 0xA);
}

int main() {
char temp[10];
int flagValidacion ;
while(1) {
printf("> ");
fgets(temp,10,stdin);
myflush(temp,10); // Tiene que ser el ultimo arreglo leido y la ultima cantidad marcada con fgets
printf("cadena: %s\n", temp);
}
}


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.


#include <stdio.h>

void myfgets_stdin(char *ptr,int size) {
int i = 0;
fgets(ptr,size,stdin);
while(i < size && ptr[i++] != 0xA);
if(i == size)
while (getchar() != 0xA);
else
ptr[i-1] = '\0';
}

int main() {
char temp[10];
int flagValidacion ;
while(1) {
printf("> ");
myfgets_stdin(temp,10);
printf("cadena: %s\n", temp);
}
}


Saludos

Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW

MAFUS

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.