3

Cplusplus.com でこの記事を見ていました。 http://www.cplusplus.com/reference/iostream/istream/peek/

ファイルの最後に到達した場合に peek() が何を返すかはまだわかりません。

私のコードでは、このステートメントが真である限り、プログラムの一部が実行されるはずです

(sourcefile.peek() != EOF)

sourcefile は私の ifstream です。

ただし、ファイルの最後に到達しても、ループを停止することはありません。

EOFは「ファイルの終わり」を意味しませんか? それとも私の使い方が悪かったのでしょうか?

4

4 に答える 4

2

EOF は古い C スタイル関数用です。を使用する必要がありますistream::traits_type::eof()

編集: コメントを表示すると、ソース ブロックのコンテキストで偶然再定義されていない限り、istream::traits_type::eof()が と同じ値を返すことが保証されていることがわかります。アドバイスはまだOKですが、これは投稿された質問に対する答えではありません.EOFEOF

于 2010-09-14T20:01:49.210 に答える
2

頭に浮かぶこと (コードを見ずに)。

  • EOF予想とは異なる定義になる可能性があります
  • sourcefile.peek()ファイルポインタを進めません。何らかの方法で手動で進めているのでしょうか、それとも同じキャラクターを常に見ているのでしょうか?
于 2010-09-14T20:08:13.723 に答える
2

基準を参照し、

戻り値:のtraits::eof()場合。それ以外の場合は、 を返します。good()falserdbuf()->sgetc()

についてはsgetc()

戻り値: 入力シーケンスの読み取り位置が利用できない場合は、 を返しますunderflow()

そしてunderflow

保留中のシーケンスが null の場合、関数traits::eof()は失敗を示すために戻ります。

そうそう、EOFファイルの終わりに戻ります。

より簡単に見分ける方法は、 を返すことint_typeです。の値はEOF を加えint_typeたものにすぎないため、EOF が不可能な場合char_typeはおそらく返されます。char_type

他の人が述べたようにpeek、ファイルの位置を進めません。一般的には、ループしてwhile ( input_stream )、追加の入力を取得できなかった場合に解析プロセスを強制終了させるのが最も簡単で最善です。

于 2010-09-15T02:07:07.083 に答える
0
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
//myifstream_peek1.cpp
int main()
{
 char ch1, ch2;
 ifstream readtext2;
 readtext2.open("mypeek.txt");
 while(readtext2.good())
 {
 if(readtext2.good())
 {
  ch2 = readtext2.get();   cout<< ch2;
 }
 }
   readtext2.close();
 //
 ifstream readtext1;
 readtext1.open("mypeek.txt");
 while(readtext1.good())
    {
    if(readtext1.good())
     {

        ch2 = readtext1.get();
        if(ch2 ==';')
            {
             ch1= readtext1.peek();
             cout<<ch1;  exit(1);
            }
            else {  cout<<ch2; }
        }

    }
    cout<<"\n end of ifstream peeking";
   readtext1.close();
return 0;
}
于 2011-07-03T13:53:05.053 に答える