有没有更多的C++方法可以获得EOF代码

Is there a more C++ way to get the EOF code?

本文关键字:EOF 代码 方法 C++ 有没有      更新时间:2023-10-16

在C中,EOF是在stdio.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 ;
}
std::char_traits<char>::eof()
std::char_traits<char16_t>::eof()
std::char_traits<char32_t>::eof()
std::char_traits<wchar_t>::eof()

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

当使用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++有几个不同的重载CCD_ 11函数。其中一个不带参数,其行为与C的getchar()非常相似:它返回一个int值,如果没有更多数据可用,该值将为EOF

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()。请参阅此处了解更多信息。

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

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

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