如何知道下一个字符是否是C ++中的EOF

时间:2011-06-08 18:43:51

标签: c++ eof

我需要知道ifstream中的下一个字符是否是文件的结尾。我正在尝试使用.peek()

执行此操作
if (file.peek() == -1)

if (file.peek() == file.eof())

但两者都不起作用。有办法做到这一点吗?

编辑:我要做的是在文件中的每个单词的末尾添加一个字母。为了做到这一点,我问下一个字符是否是标点符号,但是这样最后一个字就没有多余的字母了。我只使用char,而不是string

8 个答案:

答案 0 :(得分:22)

istream::peek()在检测到文件结尾或错误时返回常量EOF保证等于-1)。要健壮地检查文件结尾,请执行以下操作:

int c = file.peek();
if (c == EOF) {
  if (file.eof())
    // end of file
  else
    // error
} else {
  // do something with 'c'
}

您应该知道底层操作系统原语read(2)仅在您尝试读取过去文件末尾时发出EOF信号。因此,当您只读取最多文件中的最后一个字符时,file.eof()将不会成立。换句话说,file.eof()为假并不意味着下一个读取操作将成功。

答案 1 :(得分:8)

这应该有效:

if (file.peek(), file.eof())

但为什么不尝试读取有用的数据后检查错误?

答案 2 :(得分:2)

对于连接到键盘的流,eof条件是我打算在下一次输入时键入Ctrl + D / Ctrl + Z.

peek()完全看不到。 : - )

答案 3 :(得分:1)

file.eof()返回一个标志值。如果您无法再从文件中读取,则将其设置为TRUE。 EOF不是实际角色,它是操作系统的标记。所以当你在那里时,file.eof()应该是true

因此,在阅读(或查看)之后,您应该if (file.peek() == file.eof())而不是if (true == file.eof())来检查您是否到达文件末尾(如果我理解的话,那就是您要做的事情)正确地)。

答案 4 :(得分:1)

无法确定下一个字符是否是文件的结尾,并且尝试这样做是新C和C ++程序员犯下的最常见错误之一,因为文件中没有文件结尾符号大多数操作系统。您可以看出,读取流中的当前位置将读取文件末尾,但这通常是无用的信息。您应该测试所有读取操作的成功或失败,并根据该状态进行操作。

答案 5 :(得分:0)

通常检查我使用的文件结尾:

    if(cin.fail())
    {
        // Do whatever here
    }

实现这种方式的另一种方式是..

    while(!cin.fail())
    {
        // Do whatever here
    }

其他信息会有所帮助,因此我们知道您想要做什么。

答案 6 :(得分:0)

你没有显示你正在使用的任何代码,所以我有一些猜测。使用流时,通常不需要低级设施(如peek())。你可能感兴趣的是istream_iterator。这是一个例子,

  cout << "enter value";

  for(istream_iterator<double> it(cin), end; 
      it != end; ++it)
  {
     cout << "\nyou entered value " << *it;
     cout << "\nTry again ...";
  }

您也可以使用istreambuf_iterator直接处理缓冲区:

  cout << "Please, enter your name: ";

  string name;
  for(istreambuf_iterator<char> it(cin.rdbuf()), end;
    it != end && *it != '\n'; ++it)
  {
    name += *it;
  }
  cout << "\nyour name is " << name;

答案 7 :(得分:0)

只需在macosx中使用此代码

if (true == file.eof())

它在macosx中对我有用!