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