【问题标题】:Return value of ifstream.peek() when it reaches the end of the fileifstream.peek() 到达文件末尾时的返回值
【发布时间】:2011-04-12 08:39:01
【问题描述】:

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

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

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

(sourcefile.peek() != EOF)

sourcefile 是我的 ifstream。

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

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

【问题讨论】:

  • 你为什么偷看?为什么不只是阅读,看看它是否失败。

标签: c++ ifstream eof peek


【解决方案1】:

参考标准,

返回:traits::eof() ifgood()isfalse。否则,返回rdbuf()->sgetc()

至于sgetc()

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

还有underflow

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

是的,在文件末尾返回EOF

一个更简单的判断方法是它返回int_type。由于int_type 的值只是char_type 加上EOF 的值,因此如果EOF 不可能,它可能会返回char_type

正如其他人提到的,peek 不会推进文件位置。通常最简单也是最好的方法是在 while ( input_stream ) 上循环,让无法获取额外的输入终止解析过程。

【讨论】:

    【解决方案2】:

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

    • EOF 的定义可能与您的预期不同
    • sourcefile.peek() 不推进文件指针。您是在以某种方式手动推进它,还是一直在看同一个角色?

    【讨论】:

    • 我发现了问题,它实际上与我的while循环没有任何关系,最后一次读取是在寻找'/n',但它没有找到它,因为它实际上是文件的结尾。我应该在那里放一些东西来阻止它,以防它是文件的结尾。
    【解决方案3】:

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

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

    【讨论】:

    • ::eof()char_traits<char> 返回EOF,这是istream 之一。
    • 尽管 T.E.D 帮了我很多,但 Mark 回答了页面顶部的问题,所以我选择他作为接受的答案。谢谢你们的帮助!
    • @jwaffe 请注意他没有回答你的问题。他解决您的问题的尝试失败了,因为EOF 始终等于istream::traits_type::eof()。这是 meta.stackexchange.com/questions/64308/try-xyz-answers 的一个实例。 (我是个智障,但我可以接受)。
    • @Johannes,是要求 eof() 返回 EOF,还是只是一个常见的约定?
    • @jwaffe,您不需要选择答案,特别是如果没有一个答案真正解决了您的问题。取消点击我的答案可能还为时不晚,因为我确信它并没有真正帮助。
    【解决方案4】:
    #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;
    }
    

    【讨论】:

    • 仅代码答案不是最好的 - 尝试添加一些解释。
    猜你喜欢
    • 2017-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-04
    • 1970-01-01
    • 2022-12-22
    • 2012-07-15
    相关资源
    最近更新 更多