1

C では、EOFで定義されているマクロstdio.hです。それに相当する C++ があるのだろうか (aconst intまたは sth)?

私は何のためにそれをしたいですか?たとえば、次を実装したい場合がありSeekEof()ます。

// Is there any non-space character remaining?
bool SeekEof(std::istream &in) { 
  int c(0);
  while ((c = in.peek()) != EOF &&
         (c == ' ' || c == '\t' || 
          c == '\r' || c == '\n')) in.get();
  return c == EOF ;
}
4

4 に答える 4

4
std::char_traits<char>::eof()
std::char_traits<char16_t>::eof()
std::char_traits<char32_t>::eof()
std::char_traits<wchar_t>::eof()
于 2012-09-14T01:23:31.757 に答える
2

stdio.hC++ アプリケーションでも使用できます。ただし、使用には注意してください。その愚かな (-1) マクロと -1 からバイトは 255 (0xff) です。EOF までの入力文字をチェックすると、誤った end of file の結果で終了する可能性があります。安全なチェックeofは、c/c++ で feof() を使用し、c++ で .eof() メソッドを使用することです。

于 2012-09-14T01:01:46.953 に答える
1

<stdio.h>C の関数を使用してファイルまたはその他のストリームから読み取る場合、特定の関数によって返される特別な値であり、ファイルの末尾に到達したEOF、エラーが発生したために、これ以上データを読み取れないことを示します。関数と関数がありますが、これらは、ファイルの終わりまたはエラー状態を検出した後にのみ使用して、一方を他方と区別する必要があります。feof()ferror()

たとえば、古典的な C 入力ループは次のとおりです。

int c; /* Note int, *not* char */
while ((c = getchar()) != EOF) {
    /* do something with c */
}
/* optional: */
if (ferror(stdin)) {
     /* an error occurred, not just end-of-file */
}

C++ には、いくつかの異なるオーバーロードされstd::istream::get()た関数があります。そのうちの 1 つは引数を取らず、C と非常によく似た動作をします。これ以上データが利用できない場合の値をgetchar()返します。intEOF

int c;
while ((c = std::cin.get()) != EOF) {
   // do something with c
}

#include <cstdio>の定義を取得する必要がありますEOF

別のオーバーロードされたバージョンは、 a への参照を取り、何かを読み取ることができたかどうかをテストできる結果をchar返します。istream&

char c;
while (std::cin.get(c)) {
    std::cout << c;
}

ファイルの終わりフラグが設定されているかどうかを通知するeof()関数 (具体的には ) があります。std::ios::eof()他にもいくつかの状態関数があります: good()fail()およびbad()詳しくはこちらをご覧ください。

(注: cplusplus.com は適切なリソースと見なされますか? そうでない場合はお知らせください。リンクを変更します。)

いずれにせよ、状態関数 (feof()およびferror()CI/O の場合eof()fail()bad()good()C++ I/O の場合) をループ条件として使用しないでください。代わりに、入力を試行したときに得られる結果によってループを制御する必要があり、ループが終了した後に他の関数を使用て、ループが終了した理由を判断できます。

于 2012-09-14T02:15:48.593 に答える
0

std::fstream fileHandle.eof() http://www.cplusplus.com/reference/iostream/ios/eof/

于 2012-09-14T00:56:31.327 に答える