EOF
常にマイナスですか?
入力の次の単語を読み取り、単語が見つかった行番号を返す関数、またはEOF
入力の最後に到達した場合に関数を作成することを考えています。EOF
が必ずしも負でない場合、関数は正しくありません。
EOF
は常に== EOF
。他のことを想定しないでください。
標準を2回目に読むと(およびここの他のコメントによると)、EOF
常に否定的であるように見えます-そして、この質問(行番号またはEOF
)で指定された使用法では機能します。私が警告するつもりだった (そして今でもそうしている) ことは、文字がポジティブでEOF
ネガティブであると仮定することです。
標準準拠の C 実装が負の文字値を持つ可能性があることを思い出してください。これは「C プログラミング言語」(K&R) にも記載されています。印刷文字は常に正ですが、一部のアーキテクチャ (おそらくすべて古いもの) では、制御文字は負です。C 標準では、char
型が符号付きか符号なしかを指定しておらず、プラットフォーム間で同じ値を持つことが保証されている唯一の文字定数は です'\0'
。
はい、EOFは常に負です。
標準は言う:
7.19入出力
7.19.1はじめに3マクロは[...]EOFであり、int型と負の値を持つ整数定数式に展開されます。これは、ファイルの終わり、つまりストリームからの入力がなくなったことを示すためにいくつかの関数によって返されます。
char
「プレーン」の署名に問題はないことに注意してください。sを処理する関数は、特に文字をにキャストしてからにキャストするため<stdio.h>
、すべての有効な文字が正の値になります。例えば:char
unsigned char
int
int fgetc(FILE *stream)
7.19.7.1
... fgetc関数は、その文字をintに変換されたunsignedcharとして取得します...
その関数を返す
EOF 値に依存する必要なく、問題は解決しました。呼び出し元は、呼び出しが成功したかどうかを簡単にテストでき、それ以外の場合は EOF/IO エラーを想定できます。
オンライン ドラフト n1256 、17.9.1.3から:
EOF
これは int 型と負の値を持つ整数定数式に展開され、ファイルの終わり、つまりストリームからの入力がなくなったことを示すためにいくつかの関数によって返されます。
EOF は常に負ですが、常に -1 であるとは限りません。
このような問題については、関数の戻り値としてエラー コード ( SUCCESS
、END_OF_FILE
、READ_ERROR
など) を返し、対象のデータを次のような別のパラメーターに書き込むことで、エラー状態をデータから分離することを好みます。
int getNextWord (FILE *stream, char *buffer, size_t bufferSize, int *lineNumber)
{
if (!fgets(buffer, bufferSize, stream))
{
if (feof(stream)) return END_OF_FILE; else return READ_ERROR;
}
else
{
// figure out the line number
*lineNumber = ...;
}
return SUCCESS;
}
EOF は値ではなく条件です。このセンチネルの正確な値は実装定義です。多くの場合、それは負の数です。
ウィキペディアから:
EOF の実際の値は、システムに依存する負の数 (通常は -1) であり、有効な文字コードと等しくないことが保証されています。
でも参考にならない…
Secure Coding から :入力および出力エラーを検出して処理します EOF は負ですが、sizeof(int) > sizeof(char)の場合のみです。