main ()
{
int c;
while ((c = getchar()) != EOF)
{
putchar(c);
}
}
私はそれgetchar()
がキャラクターをバッファリングすることを知っています。このプログラムを実行してHello
Enterキーを押さずに文字を入力するとEOF
、なぜHello
再度印刷して新しい文字を要求するのですか?
'EOF' 文字を入力すると、改行を入力していなくても、ターミナル ドライバは入力バッファ内のすべての文字をプログラムで使用できるようにします。下のコードにgetchar()
はいくつかの文字が含まれているため、まだ EOF ではありません。2 番目の 'EOF' を入力すると、送信する文字が残っていないため (ただし、ターミナル ドライバーはread()
関数に使用可能な 0 バイトがあることを通知します)、read
EOF を示す 0 バイトが返されます。
これは、完全な行を入力するまで、プログラムがシェルからの入力を受け取らないためです。それまでは、端末プログラムのバッファに格納されます。デフォルトでは、端末は C プログラムに送信する前に、ENTER が押されるまですべての情報をバッファリングします。
getchar
バッファを埋めてから一度に文字を「読み取る」のと同じputchar
ように、文字を印刷するときにも同じことを行います。文字単位の I/O を実行するには、入力ストリームと出力ストリームを非バッファ モードで開く必要があります。ただし、特にプログラムの入力と出力がファイルまたはパイプとの間で直接読み書きされる場合、これは非常に非効率的です。代わりに、可能な場合はバッファリングされた入力と出力をflush
使用するか、I/O バッファがいっぱいかどうかに関係なく出力を書き込む必要がある場合はいつでも出力ストリームを明示的に呼び出します。
Linux とおそらく gcc を使用している場合は、Ctrl+D を押して EOF を表示する必要があります。もちろん、いくつかの文字を入力した後にエンターを押さない場合は、2 回押します。