web-dev-qa-db-ja.com

Cプログラミング言語でEOFとは何ですか?

最後の印刷物を見るにはどうすればいいですか?言い換えれば、EOFのために何を入れるべきですか?定義を確認したところ、EOFは-1です。

また、Ctrl-Dを入力すると、何も表示されません。

#include <stdio.h>

int main() {
 int c;
 while((c = getchar() != EOF)) {
  printf("%d\n", c);
 }
 printf("%d - at EOF\n", c);
}
34
Chris_45

LinuxシステムおよびOS Xでは、EOFを引き起こすために入力する文字は Ctrl-D。 Windowsの場合、 Ctrl-Z

オペレーティングシステムによっては、この文字は、行の最初の文字、つまり、 Enter。コンソール入力は多くの場合行指向であるため、システムはEOF文字を認識しない場合があります。 Enter

そして、はい、その文字がEOFとして認識されている場合、プログラムは実際の文字を見ることはありません。代わりに、Cプログラムはgetchar()から-1を取得します。

45
Carl Smotricz

かっこを変更する必要があります

while((c = getchar()) != EOF)

「=」演算子は「!=」演算子よりも優先順位が低いためです。その後、期待どおりの結果が得られます。あなたの表現は等しい

while (c = (getchar()!= EOF))

比較として「c!= EOF」を作成しているため、2つの1が出力として取得されます。これは、入力した文字に対して常に1になり、その後、リターンを押すことで「\ n」が続きます。 cが実際にEOFである最後の比較を除き、0が得られます。

EOFに関する編集:EOFは通常-1ですが、これは標準では保証されていません。標準では、7.19.1節でabout EOF

EOF。int型と負の値を持つ整数定数式に展開され、ファイルの終わり、つまりストリームからの入力がなくなったことを示すためにいくつかの関数によって返されます。

EOFは-1に等しいと仮定するのは合理的ですが、EOFを使用する場合、特定の値に対してテストするのではなく、マクロを使用する必要があります。

27
Lucas

EOFの値は、0から255の範囲の「char」値と区別するための負の整数です。通常は-1ですが、他の任意の負の数でもかまいません。 。POSIX仕様に従って、-1であると想定しないでください。

^ D文字は、入力ストリームを論理的に終了するようにUNIX/Linuxのコンソールストリームに入力する文字です。ただし、他のコンテキスト(ファイルから読み取るときなど)では、単なる別のデータ文字です。いずれにしても、^ D文字(入力の終わりを意味する)がアプリケーションコードに到達することはありません。

@Bastienが言うように、EOFはgetchar()が失敗した場合にも返されます。厳密に言えば、ferrorまたはfeofを呼び出して確認する必要がありますEOFはエラーまたはストリームの終わりを表します。ただし、ほとんどの場合、アプリケーションはどちらの場合でも同じことを行います。

7
Stephen C

[〜#〜] eof [〜#〜] はファイルの終わりを意味します。これは、ファイルの終わりに達したこと、およびデータがもうないことを示しています。

編集:

私は立ち直る。この場合、ファイルの終わりではありません。前述のように、CTRL + d(Linux)またはCTRL + Z(Windows)が渡されたときに渡されます。

4
Ikke

タイプミスのカップル:

while((c = getchar())!= EOF)

代わりに:

while((c = getchar() != EOF))

また、getchar()はリターンキーを有効な入力として扱うため、それもバッファリングする必要があります。EOFは入力の終了を示すマーカーです。通常、すべてのビットが設定されたintです。


#include <stdio.h>
int main()
{
 int c;
 while((c = getchar())!= EOF)
 {
  if( getchar() == EOF )
    break;
  printf(" %d\n", c);
 }
  printf("%d %u %x- at EOF\n", c , c, c);
}

プリント:

49 
 50 
-1 4294967295 ffffffff- EOF

入力用:

 1 
 2 
 <ctrl-d> 
4
sud03r

端末からのnputは(デバイスが切断されていない限り)実際に「終了」することはありませんが、複数の「ファイル」を端末に入力すると便利です。そのため、入力の終了を示すキーシーケンスが予約されています。 UNIXでは、キーストロークのEOFへの変換は端末ドライバによって実行されるため、プログラムは端末を他の入力ファイルと区別する必要はありません。デフォルトでは、ドライバはControl-D文字を変換します行末からファイル終了インジケータへ実際のControl-D(ASCII 04)文字を入力ストリームに挿入するには、ユーザーはその前に「引用」コマンド文字(通常はControl-V)を付けます。 AmigaDOSも同様ですが、Control-Dの代わりにControl- \を使用します。

MicrosoftのDOSおよびWindows(およびCP/Mおよび多くのDECオペレーティングシステム)では、端末からの読み取りでEOFが生成されることはありません。代わりに、プログラムはソースが端末(またはその他の「文字デバイス」)であることを認識し、指定された予約文字またはシーケンスをファイル終了インジケータとして解釈します。ほとんどの場合、これはASCII Control-Z、コード26です。MicrosoftMS-DOSシェル(COMMAND.COM)およびオペレーティングシステムユーティリティプログラムの一部を含む、一部のMS-DOSプログラムEDLINとして)、テキストファイル内のControl-Zを意味のあるデータの終わりを示すものとして扱うか、テキストファイルを書き込むときにControl-Zを最後に追加します。これは2つの理由で行われました。

  1. CP/Mとの下位互換性。 CP/Mファイルシステムは、128バイトの倍数の「レコード」でファイルの長さのみを記録したため、慣例により、Control-Z文字は、レコードの途中で終了した場合に意味のあるデータの終わりを示します。 MS-DOSファイルシステムは常にファイルの正確なバイト長を記録しているため、これはMS-DOSでは必要ありません。

  2. これにより、プログラムは同じコードを使用して、端末とテキストファイルの両方から入力を読み取ることができます。

3
redtone

EOFは値が-1の整数型です。したがって、EOFをテストするには整数変数を使用する必要があります。

1
Jency
#include <stdio.h>

int main() {
    int c;
    while((c = getchar()) != EOF) { //precedence of != is greater than =, so use braces
        printf("%d\n", c);
    }
    printf("%d - at EOF\n", c);
}

これはEOFの値をチェックする正しい方法だと思います。そして、出力を確認しました。

INPUT:abcおよびEnterの場合、OUTPUT:97 98 99 10.(the ASCII values)

INPUT Ctrl-Dの場合、出力は-1-EOFでした。したがって、-1はEOFの値だと思います。

Ctrl-Zなど、Ctrl-Dの代わりに他の入力を試してください。コンパイラごとに異なると思います。

1