2009-10-26 6 views
6

EOFは常に負ですか?EOFは常に負ですか?

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

+1

なぜあなた自身の関数からEOFを返す必要がありますか?関数を "単語が見つかった行番号を返すか、入力の終わりに達したら-1を返す"と定義するだけです。つまり、多くの情報源(例:コード・コンプリート)は、戻り値と失敗コードの混在に注意しています。 –

+0

これは可能な、完全に実行可能な代替手段です。しかし、私はEOFがもっと明白であると思った。 – Ree

答えて

10

はい、EOFは常に負です。

標準は言う:

7.19入力/出力
7.19.1をはじめ

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

「プレーン」charに署名しても問題はありません。 charを扱う関数<stdio.h>は、具体的には、すべての有効な文字が正の値を持つように、文字をunsigned charに、次にintにキャストします。

int fgetc(FILE *stream) 

7.19.7.1
...のfgetc関数はintに変換unsigned char型としてその文字を取得...

+3

'sizeof(char)== sizeof(int)'に問題がありますが、 'unsigned char'によるキャストでさえ必ずしもすべての有効な' char'値を正に保つわけではありません。幸いにも、これは比較的まれです。 –

+0

これは、負の値が常にEOF( 'if(ch <0)/ * EOF detected * /;')であると誤って判断した場合、または ''実行文字セット ''が '' INT_MIN''から ' 0 'の場合、 'EOF'の値は有効な文字の値と同じです。 – pmg

15

EOFは常に== EOFです。他の何も想定しないでください。

標準の2番目の読み方(そして他のコメントによると)では、EOFは常に負であるように見えます。この質問で指定された使用(行番号またはEOF)では動作します。私が警告することは、文字が正でEOFが負であると仮定していることです。

標準準拠のC実装では負の文字値を持つことができることに注意してください。これは 'The C programming language'(K & R)でも言及されています。印刷文字は常に肯定的ですが、アーキテクチャによっては(おそらくすべて古代)、制御文字が否定的です。 C標準では、charの型が符号付きまたは符号なしであり、プラットフォーム間で同じ値が保証される唯一の文字定数が'\0'であることが指定されていません。

+0

参照を追加できますか? – Guillaume

+6

これは間違っています。 EOFマクロ**は負の整数に拡張する必要があります**残念ながら私は現時点で標準のコピーを持っていません。 –

+0

Cライブラリリファレンスでは、ANSI C標準からの情報をほぼすべて取り上げると、「EOFはファイルの終わりに達したことを示す負の整数です」(http://www.acm .uiuc.edu/webmonkeys/book/c_guide/2.12.html#variables)。それは、私はまだそれが悪いスタイルだと言って、それの上に、EOFが負であると仮定することは不要であると言いました。 –

8

は、その関数の戻り値

  • に単語が
  • で発見された場合は-1に入力の終わりがなくても、解決

問題に達している行番号を持っています任意のEOF値に依存します。呼び出し元は、呼び出しが成功するとゼロ以上になるかどうかを簡単にテストし、それ以外の場合はEOF/IOエラーとみなします。

+0

確かに、これは良い選択肢です。 – Ree

1

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

wikipedia
1

から:

EOFの実際の値は、任意の有効な文字コードに等しくない ことが保証され システム依存負の数、 一般-1、です。

しかし、無参照...セキュアコーディングから

Detect and handle input and output errors EOFが負であるが、ときにのみsizeof(int) > sizeof(char)

+0

ウィキペディアは完全にはここでは正しくありません。 EOFは-1であり、符号付き文字の場合、文字は-1の値を持つことができます(たとえば、Windows-1252のユーロ記号)。 '(f)getc'の戻り値がunsigned charへの次の文字キャスト、そして' int'へのキャストであり、これは 'EOF'と一致しないはずです。もちろん、これは 'sizeof(int)!= sizeof(char)'の場合にのみ機能します。 –

2

online draft n1256から、17.9.1.3:たとえば、 :

EOF

整数型の定数式に展開し、整数型と負の値の で、ファイルの末尾がであることを示すいくつかの関数によって返されます。つまり、ストリームからの入力はありません。 ;

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; 
}  
関連する問題