質問

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

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

私のコードでは、この声明が真である限り、プログラムの一部が実行されることになっています

(sourcefile.peek() != EOF)

SourceFileは私のifstreamです。

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

EOFは「ファイルの終わり」を意味しませんか?それとも私はそれを間違っていましたか?

役に立ちましたか?

解決

標準に相談し、

戻り値:traits::eof() もしもgood()false. 。それ以外の場合、返品rdbuf()->sgetc().

はどうかと言うと sgetc(),

返品:入力シーケンス読み取り位置が利用できない場合、返品 underflow().

underflow,

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

うん、戻ってきます EOF ファイルの終わりに。

簡単に伝える方法は、それが戻ってくることです int_type. 。の値以来 int_type ただのものです char_type さらに、EOF、それはおそらく戻ってくるでしょう char_type EOFが不可能な場合。

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

他のヒント

思い浮かぶこと(あなたのコードを見ずに)。

  • EOF 予想とは異なる方法で定義できます
  • sourcefile.peek() ファイルポインターを進めません。どういうわけか手動でそれを進めていますか、それともあなたはおそらく常に同じキャラクターを見ていますか?

EOFは、古いCスタイル機能用です。使用する必要があります istream::traits_type::eof().

編集: :コメントを見ると、私にそれを納得させます istream::traits_type::eof() 同じ値を返すことが保証されています EOF, 、偶然ではない限り EOF ソースブロックのコンテキストで再定義されています。アドバイスはまだ大丈夫ですが、これはそうです 答えではありません 投稿された質問に。

#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;
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top