C++ 到达文件末尾时返回ifstream.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

我在看Cplusplus.com上的这篇文章

我仍然不确定peek()到达文件末尾时会返回什么

在我的代码中,只要该语句为真,程序的一部分就应该运行

(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”,但它没有找到它,因为它实际上是文件的结尾。我应该在那里放一些东西来阻止它,以防它是文件的结尾。为什么要偷看?为什么不直接读取并查看它是否失败。仅代码答案不是最好的-尝试添加一些解释。