返回ifstream.peek()到达文件末尾时的值
题
我在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
如果不可能。
正如其他人提到的 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;
}
不隶属于 StackOverflow