1

在 C 中,EOF是一个定义在stdio.h. 我想知道是否有与它等效的 C++(aconst int或 sth)?

我要它干什么?例如,我可能想实现一个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

4 回答 4

4
std::char_traits<char>::eof()
std::char_traits<char16_t>::eof()
std::char_traits<char32_t>::eof()
std::char_traits<wchar_t>::eof()
于 2012-09-14T01:23:31.757 回答
2

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

于 2012-09-14T01:01:46.953 回答
1

<stdio.h>当使用 C函数从文件或其他流中读取时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():它返回一个int值,EOF如果没有更多数据可用:

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

你必须#include <cstdio>得到 的定义EOF

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

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

有一个eof()函数(特别是std::ios::eof())告诉您是否设置了文件结束标志。还有其他几个状态函数good()fail()bad()浏览此处获取更多信息。

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

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

于 2012-09-14T02:15:48.593 回答
0

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

于 2012-09-14T00:56:31.327 回答