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

How to know if the next character is EOF in C++

本文关键字:C++ 中的 EOF 是否是 字符 何知道 下一个      更新时间:2023-10-16

我需要知道ifstream中的下一个字符是否是文件的末尾。我正试着用.peek():来做这件事

if (file.peek() == -1)

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

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

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

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()为假并不意味着下一次读取操作将成功。

这应该有效:

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

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

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

所以,在读取(或偷看)之后,应该使用if (true == file.eof())来检查是否到达文件末尾(如果我理解正确的话,这就是您想要做的),而不是if (file.peek() == file.eof())

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

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

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

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

另一种实现方式是

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

其他信息会很有帮助,这样我们就可以知道您想做什么。

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

您没有显示任何正在使用的代码,所以我有一些猜测。在处理流时,通常不需要低级别的设施(如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_titerator直接处理缓冲区:

  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;

只需在macosx 中使用此代码

if (true == file.eof())

它在macosx对我有用!