是否有更多的C ++方法来获取EOF代码?

时间:2012-09-14 00:53:46

标签: c++

在C中,EOFstdio.h中定义的宏。我想知道是否有一个与之相当的C ++(const int或者......)

我想要它做什么?例如,我可能想要实现SeekEof()

// Is there any non-space character remaining?
bool SeekEof(std::istream &in) { 
  int c(0);
  while ((c = in.peek()) != EOF &&
         (c == ' ' || c == '\t' || 
          c == '\r' || c == '\n')) in.get();
  return c == EOF ;
}

4 个答案:

答案 0 :(得分:4)

std::char_traits<char>::eof()
std::char_traits<char16_t>::eof()
std::char_traits<char32_t>::eof()
std::char_traits<wchar_t>::eof()

答案 1 :(得分:2)

您也可以在c ++应用程序中使用stdio.h。但要小心使用它。它的愚蠢(-1)宏和-1到字节是255(0xff)。如果检查输入字符到EOF,则可以以伪结尾的结果结束。 eof的安全检查是在c ++中的c / c ++和.eof()方法中使用feof()。

答案 2 :(得分:1)

使用C的<stdio.h>函数从文件或其他流中读取时,EOF是某些函数返回的特殊值,用于标记无法读取更多数据,因为您已达到文件的结尾,因为出现错误。有feof()ferror()函数,但这些函数只应在之后检测到,文件结束或错误条件时使用,以区分彼此。

例如,经典的C输入循环是:

int c; /* Note int, *not* char */
while ((c = getchar()) != EOF) {
    /* do something with c */
}
/* optional: */
if (ferror(stdin)) {
     /* an error occurred, not just end-of-file */
}

C ++有几个不同的重载std::istream::get()函数。其中一个不带参数,行为与C getchar()非常相似:如果没有更多数据可用,它将返回intEOF

int c;
while ((c = std::cin.get()) != EOF) {
   // do something with c
}

您必须#include <cstdio>才能获得EOF的定义。

另一个重载版本会引用char并返回istream&结果,可以对其进行测试以判断它是否能够读取任何内容:

char c;
while (std::cin.get(c)) {
    std::cout << c;
}

eof()函数(特别是std::ios::eof())告诉您是否设置了文件结束标志。还有其他几个状态函数:good()fail()bad()See here for more information.

(注意:cplusplus.com被认为是一个很好的资源吗?如果没有,请告诉我,我会更改链接。)

在任何情况下,状态函数(feof()ferror()用于CI / O,eof()fail()bad()good()对于C ++ I / O)不应该用作循环条件;相反,循环应该由您在尝试输入时获得的结果控制,并且其他函数可以在循环终止后使用来确定它终止的原因。

答案 3 :(得分:0)

std :: fstream fileHandle.eof() http://www.cplusplus.com/reference/iostream/ios/eof/