9

EOF常にマイナスですか?

入力の次の単語を読み取り、単語が見つかった行番号を返す関数、またはEOF入力の最後に到達した場合に関数を作成することを考えています。EOFが必ずしも負でない場合、関数は正しくありません。

4

6 に答える 6

16

EOFは常に== EOF。他のことを想定しないでください。

標準を2回目に読むと(およびここの他のコメントによると)、EOF常に否定的であるように見えます-そして、この質問(行番号またはEOF)で指定された使用法では機能します。私が警告するつもりだった (そして今でもそうしている) ことは、文字がポジティブでEOFネガティブであると仮定することです。

標準準拠の C 実装が負の文字値を持つ可能性があることを思い出してください。これは「C プログラミング言語」(K&R) にも記載されています。印刷文字は常に正ですが、一部のアーキテクチャ (おそらくすべて古いもの) では、制御文字は負です。C 標準では、char型が符号付きか符号なしかを指定しておらず、プラットフォーム間で同じ値を持つことが保証されている唯一の文字定数は です'\0'

于 2009-10-26T10:24:12.127 に答える
12

はい、EOFは常に負です。

標準は言う:

7.19入出力
7.19.1はじめに

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

char「プレーン」の署名に問題はないことに注意してください。sを処理する関数は、特に文字をにキャストしてからにキャストするため<stdio.h>、すべての有効な文字が正の値になります。例えば:charunsigned charint

int fgetc(FILE *stream)

7.19.7.1
... fgetc関数は、その文字をintに変換されたunsignedcharとして取得します...

于 2009-10-26T10:46:20.290 に答える
8

その関数を返す

  • 単語が見つかった行番号
  • 入力の終わりに達した場合は -1

EOF 値に依存する必要なく、問題は解決しました。呼び出し元は、呼び出しが成功したかどうかを簡単にテストでき、それ以外の場合は EOF/IO エラーを想定できます。

于 2009-10-26T10:26:52.783 に答える
2

オンライン ドラフト n1256 、17.9.1.3から:

EOF

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

EOF は常に負ですが、常に -1 であるとは限りません。

このような問題については、関数の戻り値としてエラー コード ( SUCCESSEND_OF_FILEREAD_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;
}      
于 2009-10-26T18:34:47.463 に答える
1

EOF は値ではなく条件です。このセンチネルの正確な値は実装定義です。多くの場合、それは負の数です。

于 2009-10-26T10:29:59.323 に答える
1

ウィキペディアから:

EOF の実際の値は、システムに依存する負の数 (通常は -1) であり、有効な文字コードと等しくないことが保証されています。

でも参考にならない…

Secure Coding から :入力および出力エラーを検出して処理します EOF は負ですが、sizeof(int) > sizeof(char)の場合のみです。

于 2009-10-26T10:30:57.270 に答える