2012-12-21 4 views
19

stdinは、デフォルトではバッファリングされた入力です。 10とにかく標準バッファーを覗いてもらえますか?

ある

int main() 
{ 
    char c[10] = {'\0'}; 
    scanf("%9s", c); 
    printf("%s, and left is: %d\n", c, getchar()); 
    return 0; 
} 

ハロー
ハロー
./a.out、左:例えばscanf()としてその証拠は、stdinの「データを残す」の機構のいずれかの使用でありますもちろん、改行され

10 ...

私はいつも好奇心てきた、とにかくの「のぞき見」にありstdinそこに存在する可能性のあるものを削除せずにバッファー?

EDIT
より良い例があるかもしれない: "at.ct" の入力で

scanf("%9[^.]", c); 

、今私はstdinに残された "データ"(ct\n)だけでなく、改行を持っています。

+1

あなたは覗くことで 'ungetc()'することができます。十分に良い? –

+0

@DanielFischer - それは悪くないと思います...もしキャラクターの束が残っていたら? stdinに残っているデータの長さを知ることはできますか?または1つ以上の文字をungetc()できますか? – Mike

+0

"プッシュバックの1文字が保証されています。ストリーム上での読み込みやファイルの配置操作を介さずに' ungetc'関数を同じストリームで何度も呼び出すと、操作が失敗することがあります。通常は、複数をungetcできますが、1つしか保証されません。 –

答えて

11

移植可能な入力ストリームの次の文字をgetchar()で取得してから、ungetc()を押して戻すと、文字がストリームから削除されていないかのような状態になります。

ungetc関数は、入力ストリームがストリームによって指さにバック(unsigned char換算)cで指定された文字を押します。プッシュバックされた文字は、そのストリームの後続の読み込みによって、プッシュの逆の順序で返されます。

標準ではプッシュバックの文字が1文字だけ保証されていますが、通常はさらに戻すことができます。

他の回答で述べたように、 NULLポインタでない

buf場合は、それが指す配列を:それは問題がないわけではないが、あなたは、setvbufを使用して独自のバッファを提供する場合があり、コメントは、実際には、あなたはほぼ確実にバッファを覗くことができますsetvbufファンクション

によって割り当てられたバッファの代わりに、提供されたバッファがまったく使用されない可能性があります。

いつでも配列の内容は不定です。

これは、バッファの内容が実際の入力を反映していることを保証していないことを意味します(自動保存期間がある場合はバッファの未定義動作を使用します。

しかし、実際には、バッファされた入力の未使用部分がどこで始まり、どこで終了するのかが重要です。

+1

入力バッファが空であるときに 'getchar'を実行して、何か読み込むまでブロックしますか? –

+0

実際、そうだろう。私は、バッファが空であるかどうかをチェックする移植可能な方法を知らない。 –

5

stdinにsetvbufという独自のバッファを設定し、必要に応じていつでもそこを見ることができます。

+0

これは 'ungetc'とどのようにやりとりしますか?私は 'ungetc'の文字が他の変数に格納されていると思います。また、バッファのどの部分が読み込まれ、何が残されているかはどのように分かりますか? – Shahbaz

+0

'setvbuf()関数はstdout、stdin、stderr.に何の影響もありません。私が読んだものです。機能的な例がありますか? – Mike

+0

@Mike Windowsではうまくいくようです。 'ungetc'は期待通りに動作します。読んだ/左の位置を追跡する方法については完全にはわかりません。しかし、バフが新しく裏打ちされていれば、それは簡単だろう。 – nullpotent

3

あなたはそれを変更することなく、stdinバッファを見たい場合は、あなたがアクセスすることができ、アレイを使用して、setbufで別のバッファを使用するためにそれを言うことができる:

char buffer[BUFSIZ]; 

if (setbuf(stdin, buffer) != 0) 
    // error 

getchar(); 

printf("%15s\n", buffer); 

これは、あなたがより多くのものを見てみましょうungetcしかし、私はあなたが移植可能な方法でさらに行くことができるとは思わない。

は、実際にこれは、合法的であるが、setvbufについてそれから引用、標準のために正しくない(setbuf同じ挙動を有する):

いつでも配列の内容は不定です。

これは完全な移植性と標準準拠性を求めている場合に必要なものではありませんが、バッファに期待される内容が含まれてはならない理由はわかりません。しかし、それは私のコンピュータで動作するようです。

少なくともBUFSIZ文字の配列をsetbufに指定する必要があります。その前にストリームに対してI/O操作を行わないでください。柔軟性が必要な場合は、setvbufをご覧ください。

関連する問題