我在Cplusplus.com上看过这篇文章,http://www.cplusplus.com/reference/iostream/istream/peek/
我仍然不确定peek()在到达文件末尾时会返回什么。
在我的代码中,只要此语句为真,程序的一部分就应该运行
(sourcefile.peek() != EOF)
其中sourcefile是我的ifstream。
但是,它永远不会停止循环,即使它已到达文件的末尾。
EOF不是指“文件结束”吗?或者我使用它错了?
答案 0 :(得分:2)
EOF适用于较旧的C风格功能。您应该使用istream::traits_type::eof()
。
修改:查看评论让我确信istream::traits_type::eof()
保证会返回与EOF
相同的值,除非偶然重新定义EOF
源块的上下文。虽然建议仍然可以,但对于发布的问题,不是答案。
答案 1 :(得分:2)
想到的事情(没有看到你的代码)。
EOF
的定义可能与您预期的不同sourcefile.peek()
不会使文件指针前进。你是不是以某种方式手动推进它,或者你是否经常看同一个角色?答案 2 :(得分:2)
咨询标准,
如果
traits::eof()
为good()
,则返回false
。否则,返回rdbuf()->sgetc()
。
至于sgetc()
,
返回:如果输入序列读取位置不可用,则返回
underflow()
。
underflow
,
如果挂起的序列为null,则函数返回
traits::eof()
以指示失败。
所以,在文件末尾返回EOF
。
更简单的方法是返回int_type
。由于int_type
的值只是char_type
加上EOF的值,如果无法使用EOF,则可能会返回char_type
。
正如其他人所提到的,peek
不会提升档案位置。通常最简单,最好只循环while ( input_stream )
并让失败获取额外的输入会终止解析过程。
答案 3 :(得分: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;
}