web-dev-qa-db-ja.com

CコードでEOFを表しますか?

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

36
static_rtti

EOFは文字ではありません(ほとんどの最新のオペレーティングシステム)。これは、ストリームの終わりに達したときにファイルストリームに適用される単純な条件です。混乱が発生するのは、ユーザーが特殊文字を入力してコンソール入力にsignalEOF(たとえば、Unix、LinuxのControl-Det al)が、この文字は実行中のプログラムからは見えません。オペレーティングシステムがキャッチし、プロセスにEOFを通知します。

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

62
Paul R

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

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

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

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

7
pmakholm

EOFは文字ではありません。できません:(バイナリ)ファイルには任意の文字を含めることができます。バイトが増え続け、0 1 2 3 ... 255、もう一度0 1 ... 255の合計512バイトのファイルがあるとします。 EOFとみなされる256バイトのうち、どれでも、ファイルは短くなります。

getchar() et al。 intを返します。可能な戻り値の範囲は、charが取りうる値に加えて、真のintEOFstdio.hで定義)です。それはまた、戻り値をcharbeforeに変換してEOFのチェックが機能しない理由でもあります。

一部のプロトコルには「EOF」「文字」があることに注意してください。 ASCIIには「テキストの終わり」、「伝送の終わり」、「伝送の終わり」、および「メディアの終わり」があります。他の答えは古いOSに言及しています。 LinuxおよびWindowsコンソール上の^ Zは、プログラム入力の提供を停止します(ただし、パイプを介して読み取られるファイルは、^ Dおよび^ Z文字をどこにでも持つことができ、バイトがなくなるとEOFのみを通知します。) C文字列は'\0'文字で終了しますが、これは文字'\0'containできないことも意味します。これがすべてのC非文字列データ関数が機能する理由です。 char配列(データを格納するため)とsize_t(データの終了位置を知るため)を使用します。

編集:C99標準§7.19.1.3は次のように述べています:

マクロは[...]
[〜#〜] eof [〜#〜]
これは、int型と負の値を持つ整数定数式に展開され、end-of-file、つまり、ストリームからの入力はもうありません。

6
aib

私はすべてのコメントを読みました。これを印刷すると何が起こるかに気付くのは興味深いです:

printf("\nInteger =    %d\n", EOF);             //OUTPUT = -1
printf("Decimal =    %d\n", EOF);               //OUTPUT = -1
printf("Octal =  %o\n", EOF);                   //OUTPUT = 37777777777
printf("Hexadecimal =  %x\n", EOF);             //OUTPUT = ffffffff
printf("Double and float =  %f\n", EOF);        //OUTPUT = 0.000000
printf("Long double =  %Lf\n", EOF);            //OUTPUT = 0.000000
printf("Character =  %c\n", EOF);               //OUTPUT = nothing

ここでわかるように、EOFは文字ではありません).

4

答えはNOですが、...

fgets()の動作により混乱する可能性があります

http://www.cplusplus.com/reference/cstdio/fgets/ から:

ストリームから文字を読み取り、(num-1)文字が読み取られるか改行またはファイルの終わりになるまで、C文字列としてstrに格納します。 -)のいずれか早い方に到達します。

1
betontalpfa

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

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

1
Harsh Vardhan

EOF Windows(およびMSDOS、CP/M)のコマンドインタープリターによって認識される文字は0x1a(10進数26、別名Ctrl + Z別名SUB)です)

今日でも、たとえばバイナリファイルの人間が読めるヘッダーの終わりをマークするために使用できます。ファイルが "Some description\x1a"で始まる場合、ユーザーはTYPEコマンドを使用してファイルの内容をコンソールにダンプできます。ダンプは、EOF 文字で停止します。つまり、印刷一部の説明で停止し、後続のゴミを続行する代わりに停止します。

1
Axel Rietschin

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

0
onoma

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

0
Lundin

システムごとに異なると思いますが、チェックする方法の1つはprintfを使用することです

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

私はこれをWindows上で行い、-1がコンソールに出力されました。お役に立てれば。

0
Keith Miller