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

Tae*_*Tae 11 c++ eof

我需要知道下一个char ifstream是否是文件的结尾.我正在尝试这样做.peek():

if (file.peek() == -1)
Run Code Online (Sandbox Code Playgroud)

if (file.peek() == file.eof())
Run Code Online (Sandbox Code Playgroud)

但都不起作用.有办法做到这一点?

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

zwo*_*wol 23

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

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

你应该知道,底层操作系统原始的,read(2)只有当你尝试读取信号EOF 过去的文件的末尾.因此,file.eof()当你仅仅阅读不会是真的达到文件中的最后一个字符.换句话说,file.eof()假为并不意味着下一个读操作将成功.

  • 在100%kosher C++中,`EOF`是`std :: ifstream :: traits_type :: eof()`. (11认同)
  • `std :: ifstream :: traits_type`是`std :: char_traits <char>`,`std :: char_traits <char> :: eof()`被定义为`EOF`.C++ 98 [lib.char.traits.specializations.char]/7.如果你使用的是宽流,你需要使用`WEOF`,如果你使用`basic_ifstream`和你自己的traits类,你当然会使用该类的`eof()`,但我认为没有理由进行批量处理在没有必要的情况下引用特征类型的代码. (3认同)

Ben*_*igt 8

这应该工作:

if (file.peek(), file.eof())
Run Code Online (Sandbox Code Playgroud)

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