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

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

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

(sourcefile.peek() != EOF)

sourcefile是我的ifstream。

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

eof并不意味着“文件结尾”?还是我错了?

有帮助吗?

解决方案

咨询标准,

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

至于 sgetc(),

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

underflow,

如果待处理序列为null,则函数返回 traits::eof() 表示失败。

是的,返回 EOF 在文件结尾。

一个简单的方法是返回 int_type. 。因为 int_type 只是那些 char_type 再加上EOF,它可能会返回 char_type 如果不可能。

正如其他人提到的 peek 不推进文件位置。通常最简单,最好只是循环 while ( input_stream ) 并让未能获得额外的输入杀死解析过程。

其他提示

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

  • EOF 可能与您期望的不同
  • sourcefile.peek() 不推进文件指针。您是在某种程度上手动推进它,还是您可能不断地看着同一角色?

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

编辑: :查看评论使我说服我 istream::traits_type::eof() 保证返回与 EOF, ,除非偶然 EOF 在源块的上下文中已重新定义。虽然建议还可以,但这是 不是答案 向发布的问题。

#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;
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top