2016-04-05 16 views
1

私の入力バッファ(おそらくstdinと呼ばれる)が空であるかどうかを調べる方法を知りたいです。 バッファが空であればプログラムを停止したくないので、入力を必ず '\ n'で終わらせたくないので、scanfだけでは不十分です。C |私の入力バッファ(stdin)が空であるかどうかをチェックする方法?

私はGoogleとこのウェブサイトで検索してみましたが、回答が足りませんでした。 私はこのようなFEOF(標準入力)を使用してみました:

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

が、それがなかったすべては関係なく、入力を0を印刷しませんでした。 2回目のスキャン後にfflush(stdin)を追加すると同じ結果が得られました。 他の回答はselectとpollを使って示唆されましたが、私はこれらの関数の説明を見つけることができませんでした。 他のフォーラムでgetchar()を使用するように言われましたが、私は彼らが私の質問を誤解していたと思います。

私は試してみました:Cどのように入力バッファが空であるかチェックしています。Cの入力が空です。 これは一般的な質問です。具体的なコードではないので、なぜそれが必要なのかは問題ではありません。

**私がselect/pollを使用することをお勧めする場合は、それらを使用する方法についての説明を追加できますか?

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

fseekstdin入力バッファの末尾にポインタを置きます。ここでは

+0

はSOの質問をする方法を参照してください。ここにコードはありません。 – Boiethios

+1

専用スレッドの入力から読み取ります。 –

+0

「googleとこのウェブサイトで検索しましたが、回答がありませんでした」 - 使用したseachストリングと返されたリンクが十分でない理由を教えてください。 –

答えて

1

は、これを解決するためのコードです。 ftellはファイルのサイズを返します。

0

あなたはO_NONBLOCKにそれのfcntlのことができるように、他の非ブロッキングI/Oのように扱う必要があり、空のSTDINをブロックしたくない場合。その時点で、fgetcのようなものへのコールは、値がEAGAINのストリームが空であればすぐに戻す必要があります。

+0

元の記事を編集しました。私はこのことをあきらめました。代わりに、今、スタンドアロンの入力/出力全体を詳細に学習しようとしています。私は、単に「物事を得るためにscanfだけ」以上のことを学びたいと思っています。私はstdinが何であるか、そして入力がどのように機能するかをexaclyに知りたいのです。どんな学習ソースを教えてもらえますか? –

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

これを試すと、副作用を解消するためにungetc(ch, stdin);が追加されました。

0

select()を使用してブロッキングの問題を処理できます。マニュアルページselect(2)には、stdinというポーランド語の例があります。それでも、行区切り文字('\n')を必要とする問題は解決していません。これは、実際に端末が入力を処理する方法によるものです。あなたがのtermiosを使用することができますLinuxの

#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); 
} 
関連する問題