2016-04-05 9 views
1

Ich möchte wissen, wie ich überprüfen kann, ob mein Eingabepuffer (vielleicht stdin genannt) leer ist oder nicht. Ich möchte nicht, dass das Programm stoppt, wenn der Puffer leer ist, und ich möchte nicht, dass die Eingabe notwendigerweise mit '\ n' endet, deshalb ist es einfach nicht genug scanf zu benutzen.C | Wie überprüfe ich, ob mein Eingabepuffer (Stdin) leer ist?

Ich habe versucht, auf Google und auf dieser Website zu suchen, aber keine Antwort war genug. Ich habe versucht, mit feof (stdin) wie folgt aus:

int main() 
{ 
char c,x; 
int num; 
scanf("%c",&c); 
scanf("%c",&x); 
num=feof(stdin); 
printf("%d",num); 
} 

aber alle es taten, war 0 Druck unabhängig von der Eingabe. Das Hinzufügen von fflush (stdin) nach dem zweiten scanf ergab das gleiche Ergebnis. andere Antworten vorgeschlagen mit Auswahl und Abfrage, aber ich konnte keine Erklärungen für diese Funktionen finden. ein anderes Forum hat mir gesagt, getchar() zu benutzen, aber ich denke, sie haben meine Frage falsch verstanden.

bei der Google-Suche habe ich versucht: C, wie Eingangspuffer leer zu prüfen, C stdin leer, c "Eingangspuffer" überprüfen leer. Dies ist eine allgemeine Frage, es ist nicht für einen bestimmten Code, also ist es egal, warum ich es brauche.

** Wenn Sie vorschlagen, dass ich Select/Poll benutze, können Sie bitte eine Erklärung hinzufügen, wie Sie diese verwenden? Hier

+0

Sehen Sie, wie auf SO eine Frage zu stellen. Es gibt keinen Code hier ... – Boiethios

+1

Lesen von der Eingabe in einem dedizierten Thread. –

+0

"Ich habe versucht, auf Google und auf dieser Website zu suchen, aber keine Antwort war genug" - bitte sagen Sie uns, welche Suchzeichenfolge Sie verwendet haben, und warum die Links nicht ausreichend waren. –

Antwort

1

ist der Code für die Lösung dieses:

fseek (stdin, 0, SEEK_END); 
num = ftell (stdin); 

fseek wird der Zeiger am Ende des stdin Eingangspuffer setzen. ftell gibt die Größe der Datei zurück.

0

Wenn Sie nicht wollen, auf einem leeren stdin blockieren Sie zu Fcntl es O_NONBLOCK Lage sein sollte, und es wie jedes andere nicht-blockierende I/O behandeln. An diesem Punkt sollte ein Anruf an etwas wie fgetc sofort zurückkehren, entweder mit einem Wert oder EAGAIN, wenn der Strom leer ist.

+0

naja, ich gab irgendwie auf diese Sache. Stattdessen versuche ich jetzt, den ganzen Standart c Input/Output in Details zu lernen, ich meine, ich will mehr als nur "nur scanf Dinge zu bekommen". wie ich genau wissen will, was stdin ist und wie die eingabe funktioniert. Kannst du mir irgendeine Lernquelle empfehlen? –

0
int ch = getc(stdin); 
if (ch == EOF) 
    puts("stdin is empty"); 
else 
    ungetc(ch, stdin); 

Try this wird ungetc(ch, stdin); hinzugefügt, um die Nebenwirkungen zu eliminieren.

0

Sie können select() verwenden, um das Blockierungsproblem zu behandeln, und die Manpage select(2) hat ein anständiges Beispiel, das stdin abfragt. Das behebt immer noch nicht das Problem, ein Zeilentrennzeichen ('\n') zu benötigen. Dies liegt an der Art und Weise, wie das Terminal Eingaben verarbeitet.

Unter Linux Sie termios verwenden können,

#include <stdio.h> 
#include <unistd.h> 
#include <termios.h> 

// immediate mode getchar(). 
static int getch_lower_(int block) 
{ 
    struct termios tc = {}; 
    int status; 
    char rdbuf; 
    // retrieve initial settings. 
    if (tcgetattr(STDIN_FILENO, &tc) < 0) 
     perror("tcgetattr()"); 
    // non-canonical mode; no echo. 
    tc.c_lflag &= ~(ICANON | ECHO); 
    tc.c_cc[VMIN] = block ? 1 : 0; // bytes until read unblocks. 
    tc.c_cc[VTIME] = 0; // timeout. 
    if (tcsetattr(STDIN_FILENO, TCSANOW, &tc) < 0) 
     perror("tcsetattr()"); 
    // read char. 
    if ((status = read(STDIN_FILENO, &rdbuf, 1)) < 0) 
     perror("read()"); 
    // restore initial settings. 
    tc.c_lflag |= (ICANON | ECHO); 
    if (tcsetattr(STDIN_FILENO, TCSADRAIN, &tc) < 0) 
     perror("tcsetattr()"); 
    return (status > 0) ? rdbuf : EOF; 
} 

int getch(void) 
{ 
    return getch_lower_(1); 
} 

// return EOF if no input available. 
int getch_noblock(void) 
{ 
    return getch_lower_(0); 
} 
Verwandte Themen