当ifstream.peek()到达文件末尾时返回值

时间:2010-09-14 19:55:53

标签: c++ ifstream eof peek

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

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

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

(sourcefile.peek() != EOF)

其中sourcefile是我的ifstream。

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

EOF不是指“文件结束”吗?或者我使用它错了?

4 个答案:

答案 0 :(得分:2)

EOF适用于较旧的C风格功能。您应该使用istream::traits_type::eof()

修改:查看评论让我确信istream::traits_type::eof()保证会返回与EOF相同的值,除非偶然重新定义EOF源块的上下文。虽然建议仍然可以,但对于发布的问题,不是答案

答案 1 :(得分:2)

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

  • EOF的定义可能与您预期的不同
  • sourcefile.peek()不会使文件指针前进。你是不是以某种方式手动推进它,或者你是否经常看同一个角色?

答案 2 :(得分:2)

咨询标准,

  

如果traits::eof()good(),则返回false。否则,返回rdbuf()->sgetc()

至于sgetc()

  

返回:如果输入序列读取位置不可用,则返回underflow()

underflow

  

如果挂起的序列为null,则函数返回traits::eof()以指示失败。

所以,在文件末尾返回EOF

更简单的方法是返回int_type。由于int_type的值只是char_type加上EOF的值,如果无法使用EOF,则可能会返回char_type

正如其他人所提到的,peek不会提升档案位置。通常最简单,最好只循环while ( input_stream )并让失败获取额外的输入会终止解析过程。

答案 3 :(得分: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;
}