3

我在 Cplusplus.com 上看这篇文章,http: //www.cplusplus.com/reference/iostream/istream/peek/

如果 peek() 到达文件末尾,我仍然不确定它会返回什么。

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

(sourcefile.peek() != EOF)

sourcefile 是我的 ifstream。

但是,它永远不会停止循环,即使它已经到达文件的末尾。

EOF 不意味着“文件结束”吗?还是我用错了?

4

4 回答 4

2

EOF 用于较旧的 C 风格函数。你应该使用istream::traits_type::eof().

编辑:查看评论使我确信istream::traits_type::eof()返回与 相同的值EOF,除非偶然EOF在源代码块的上下文中重新定义。虽然建议仍然可以,但这不是发布的问题的答案

于 2010-09-14T20:01:49.210 回答
2

想到的事情(没有看到你的代码)。

  • EOF定义可能与您预期的不同
  • sourcefile.peek()不推进文件指针。您是否以某种方式手动推进它,或者您是否一直在看同一个角色?
于 2010-09-14T20:08:13.723 回答
2

咨询标准,

返回: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 )并让无法获得额外的输入终止解析过程。

于 2010-09-15T02:07:07.083 回答
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;
}
于 2011-07-03T13:53:05.053 回答