ifstream.peek()のreturn値は、ファイルの最後に達したときに
質問
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;
}