C++ 到达文件末尾时返回ifstream.peek()的值
我在看Cplusplus.com上的这篇文章 我仍然不确定peek()到达文件末尾时会返回什么 在我的代码中,只要该语句为真,程序的一部分就应该运行C++ 到达文件末尾时返回ifstream.peek()的值,c++,ifstream,eof,peek,C++,Ifstream,Eof,Peek,我在看Cplusplus.com上的这篇文章 我仍然不确定peek()到达文件末尾时会返回什么 在我的代码中,只要该语句为真,程序的一部分就应该运行 (sourcefile.peek() != EOF) 其中sourcefile是我的ifstream 但是,它从未停止循环,即使它已到达文件的末尾 EOF不是指“文件结束”吗?还是我用错了?EOF用于较旧的C风格函数。您应该使用istream::traits\u type::eof() Edit:查看注释使我确信istream::traits\u
(sourcefile.peek() != EOF)
其中sourcefile是我的ifstream
但是,它从未停止循环,即使它已到达文件的末尾
EOF不是指“文件结束”吗?还是我用错了?EOF用于较旧的C风格函数。您应该使用
istream::traits\u type::eof()
Edit:查看注释使我确信istream::traits\u type::eof()
保证返回与eof
相同的值,除非在源代码块的上下文中碰巧重新定义了eof
。虽然建议仍然可以,但这并不是发布的问题的答案。想到的事情(没有看到代码)
的定义可能与您预期的不同EOF
不会推进文件指针。你是在手动推进它,还是在不断地看着同一个角色sourcefile.peek()
traits::eof()
如果good()
为false
。否则,返回rdbuf()->sgetc()
至于sgetc()
返回:如果输入序列读取位置不可用,则返回underflow()
和下溢
如果挂起序列为空,则函数返回traits::eof()
以指示失败
所以是的,在文件末尾返回EOF
一种更简单的方法是返回int\u type
。由于int\u type
的值只是char\u type
加上EOF的值,如果EOF不可能,它可能会返回char\u type
正如其他人提到的,peek
不会提升文件位置。通常,在(输入流)
时循环是最简单和最好的方法,让无法获得额外输入终止解析过程。\35; include
#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;
}
#包括
#包括
使用名称空间std;
//myifstream_peek 1.cpp
int main()
{
char ch1,ch2;
ifstream readtext2;
readtext2.open(“mypeek.txt”);
while(readtext2.good())
{
if(readtext2.good())
{
ch2=readtext2.get();cout::eof()
返回EOF
的char_traits
,这是istream
中的一个。尽管T.E.D帮了我很多忙,马克还是在页面顶部回答了问题,所以我选择他作为公认的答案。感谢你们的帮助!@jwaffe请注意,他没有回答你们的问题。他试图解决你们的问题问题失败是因为EOF
总是等于istream::traits\u type::EOF()
。这是的一个实例。(我是个迟钝者,但我同意)。@Johannes,EOF()是一个要求吗返回EOF,或者这只是一个常见的约定?@jwaffe,你不需要选择答案,特别是如果没有一个答案真正解决了你的问题。现在解开我的答案可能还不算太晚,因为我确信它没有真正的帮助。我发现了这个问题,它实际上与我的while循环没有任何关系st read正在查找“/n”,但它没有找到它,因为它实际上是文件的结尾。我应该在那里放一些东西来阻止它,以防它是文件的结尾。为什么要偷看?为什么不直接读取并查看它是否失败。仅代码答案不是最好的-尝试添加一些解释。