57

"\n"改行文字は、C コードでは で表されます。ファイルの終わり (EOF) 文字に相当するものはありますか?

4

11 に答える 11

97

EOF は文字ではありません (最近のほとんどのオペレーティング システムでは)。これは、ストリームの最後に到達したときにファイル ストリームに適用される単なる条件です。混乱が生じるのは、ユーザーが特殊文字 (Unix、Linux などの Control-D など) を入力してコンソール入力の EOF を通知する可能性があるためです。次に、EOF をプロセスに通知します。

注: 一部の非常に古いオペレーティング システムでは、EOF文字でした (CP/M の Control-Z など)。しかし、これは、ファイル システム ディレクトリで実際のファイル長を維持するオーバーヘッドを回避するための雑なハックでした。

于 2012-09-12T13:42:16.557 に答える
13

EOFはキャラクターではありません。次のことはできません: (バイナリ) ファイルには任意の文字を含めることができます。0 1 2 3 ... 255 と 0 1 ... 255 と、合計 512 バイトになる、常に増加し続けるバイトを持つファイルがあるとします。考えられる 256 バイトのうちのどれでもEOF、ファイルは短縮されます。

それが理由getchar()です。を返しますint。可能な戻り値の範囲は、charが持つことができる値に、真のintEOF( で定義stdio.h) を加えたものです。これが、チェックするchar 前に戻り値を a に変換してもEOFうまくいかない理由でもあります。

一部のプロトコルには「EOF」「文字」があることに注意してください。ASCII には、「テキストの終わり」、「伝送の終わり」、「伝送ブロックの終わり」、および「媒体の終わり」があります。他の回答では、古いOSについて言及しています。私自身、Linux では ^D を、Windows コンソールでは ^Z を入力して、プログラムへの入力を停止します。(ただし、パイプを介して読み取られるファイルは、どこにでも ^D および ^Z 文字を含めることができ、バイトが不足した場合にのみ EOF を通知します。) C 文字列は文字で終了しますが、これは、文字を含む'\0'ことができないことも意味します。そのため、すべての C の文字列以外のデータ関数は、配列 (データを格納するため) と(データの終了位置を知るため) を使用して機能します。'\0'charsize_t

編集: C99 標準 §7.19.1.3 には次のように記載されています。

マクロは [...]
EOFであり、タイプと負の値を
持つ整数定数式に展開されます。これは、いくつかの関数によって返され、ファイルの終わり、つまりストリームからの入力がないことを示します。int

于 2012-09-12T13:48:50.400 に答える
10

いいえ。EOF は文字ではなく、ファイルハンドルの状態です。

ASCII 文字セットにはデータの終わりを表す制御文字がありますが、これらは一般にファイルの終わりを知らせるためには使用されません。たとえば、場合によってはほとんど同じことを示すEOT (^D) です。

標準 C ライブラリが符号付き整数を使用して文字を返し、ファイルの終わりに -1 を使用する場合、これは実際にはエラーが発生したことを示すシグナルにすぎません。私は利用可能な C 標準を持っていませんが、SUSv3 を引用します。

ストリームのファイル終了標識が設定されている場合、またはストリームがファイルの終わりにある場合、ストリームのファイル終了標識が設定され、fgetc() は EOF を戻します。読み取りエラーが発生した場合、ストリームのエラー インジケータが設定され、fgetc() は EOF を返し、エラーを示すために errno を設定します。

于 2012-09-12T13:43:22.910 に答える
3

EOFWindows (および MSDOS、CP/M) のコマンド インタープリターが認識する文字は 0x1a (10 進数の 26、別名+ CtrlSUB Z)です。

たとえば、バイナリ ファイルの人間が読めるヘッダーの終わりをマークするために、今日でも使用でき"Some description\x1a"ますTYPE。、すなわち print Some descriptionと、それに続くゴミを続ける代わりに停止します。EOF

于 2014-09-01T20:00:57.077 に答える
1

EOF の値を実際の文字と混同することはできません。

の場合、返される値を保持するのに十分な大きさをa= getchar()宣言する必要があります。文字に加えてEOFを保持するのに十分な大きさでなければならないため、使用できません。agetchar()chara

于 2016-03-27T13:18:11.217 に答える
1

これはシステムに依存しますが、多くの場合 -1 です。こちらをご覧ください

于 2012-09-12T13:42:40.840 に答える
1

システムによって異なる場合があると思いますが、確認する方法の1つは、単に使用することですprintf

#include <stdio.h>
int main(void)
{
    printf("%d", EOF);
    return 0;
}

これを Windows で実行-1すると、コンソールに出力されました。お役に立てれば。

于 2012-09-12T13:43:40.693 に答える
0

EOFstdio.h に int 型の定数があります。標準で指定されている同等の文字リテラルはありません。

于 2012-09-12T13:42:51.340 に答える