getchar() と putchar()
-
25-09-2019 - |
質問
例では:
#include <stdio.h>
main()
{
long nc;
nc = 0;
while (getchar() != EOF)
++nc;
printf("%ld\n", nc);
}
よくわかりません。putchar() は文字を出力しますが、EOF の後にすべての文字を出力するのはなぜですか。これらすべての文字はどこで記憶されているのでしょうか?ありがとう。
解決
これは、バッファリングののと呼ばれています、それはオペレーティングシステムによって行われます。通常、それはちょうどあなたがメモリにそれを置くすべての文字を保存し、それが改行に遭遇したファイルにすべてを書き込み行バッファリングを行います。ファイル操作が他の操作よりもはるかに多くの時間がかかるので、これは、リソースを節約できます。だからではなく、一つ一つの文字で出力を行うのではなく、バッファ内に収集する文字の束を待って、一度にすべてからそれらを書き込みます。
これはOSによって行わだけ巧妙な策略だあなたは、プログラマが、心配する必要はありませんことを。ちょうどそれ一つ一つであなたの文字を投げると、OSが独自の方法で残りの部分を処理してみましょう。
他のヒント
[のこれが答えではありませんが、コメント内のコードを置くことができないの
私はあなたがこのような何かを意味だと思います:
#include <stdio.h>
main()
{
long nc;
nc = 0;
char c;
while ((c = getchar()) != EOF)
{
putchar(c); /* prints one char */
++nc;
}
printf("%ld\n", nc); /* prints the number of characters read */
}
ノーところ、このコードは、フラッシュの前に残っていたどのように多くの文字を入力し、書き込みを空にします。
このは必ず入力ファイル(標準入力)
に残っていない文字ではないということになることですコードを確認してみましょう。
#include <stdio.h>
ここまでは順調ですね...
main()
{
- の
main()
関数は常にanを返しますint
. 。いつも。 - リターンタイプのない関数を宣言する機能は、デフォルトであるため、フォームが悪いです
int
, 、しかし、コードを読むとき、人々はこれを簡単に覚えていません。
次に進みます...
long nc;
nc = 0;
良いフォーム。変数は使用前に初期化されます。
while (getchar() != EOF)
++nc;
これは少し複雑です。しかし、一度に一歩ずつ。
- の
getchar
関数は次の値を返しますint
標準入力から。 - その値は次に比較されます
EOF
. - もし
int
標準入力からの値はそうではありませんEOF
, 、変数nc
が増加します。
したがって、終了するには while
ループの場合、標準入力から EOF を生成する必要があります。
注記: 標準入力から読み取られた値はどれも 保存されました. 。式が評価された後、各値は破棄されます。
スタイル:それぞれの後に「{」と「}」を使用することをお勧めします while
声明。これは 安全 身につけてしまう習慣。
printf("%ld\n", nc);
上記のステートメントは、次の値を出力 (表示) しています。 nc
. 。の値 nc
標準入力から読み取られた文字数を表します。このステートメントは次のことを行います ない 標準入力からの任意の文字を表示します。
}
最後に、 main
プログラムはオペレーティング システムに値を返す必要があります。移植可能な 2 つの値は次のとおりです。 EXIT_SUCCESS
そして EXIT_FAILURE
, で定義されています。 stdlib.h
. 。これらの値のいずれかを指定することも良い習慣となります。
ところで、ありません putchar
あなたが投稿した例(私はこの回答にコピーしました)。
のputcharバッファに文字を入れて、それが画面にライン・ワード出力をもたらすでしょう。