C++ eof()返回什么?
代码如下:C++ eof()返回什么?,c++,eof,c-str,C++,Eof,C Str,代码如下: string fname = "/home/jack/example.csv"; ifstream csvin(fname.c_str()); if (csvin.eof()) { do_something; } 我的问题是:在什么情况下,eof()返回true。我有以下选择: 文件不存在 文件为空 文件不存在或为空 不幸的是,这没有帮助,因为我不知道eofbit错误状态标志的意思。我也不明白在与流相关联的序列中到达文件末尾是什么意思。我假设c_str()返回某个迭代器,如
string fname = "/home/jack/example.csv";
ifstream csvin(fname.c_str());
if (csvin.eof()) {
do_something;
}
我的问题是:在什么情况下,eof()
返回true。我有以下选择:
eofbit错误状态标志的意思。我也不明白在与流相关联的序列中到达文件末尾是什么意思。我假设c_str()返回某个迭代器,如果它已经被某个对象使用,那么它可能已经到达了终点。然而,我感兴趣的是当c_str()
的结果是新的时,如果文件不存在,它将返回什么?如果文件为空,它将返回什么
已编辑
我只想知道上面给出的代码在两种情况下返回了什么:
文件不存在
文件为空
eof()当正在读取的流中的位置到达文件末尾时,返回true。它实际上返回读取文件结尾(试图读取过去)时设置的eof标志的值。查看有关eof和空文件的讨论 eof
如果设置了eofbit标志(表示在ifstream
的情况下到达文件末尾),则返回true
当输入操作尝试读取超过流的结尾(iow:到达流的结尾)时,流上的所有输入操作(例如,读取
)都可以设置eofbit标志。正如注释中所指出的,即使从概念上讲,只要读取最后一个字符(或不读取空流中的任何内容),流就到达流的末尾,但在尝试读取另一个字符之前,流并不知道这一点。有关详细信息,请参阅每个输入操作的文档
请注意,构造流不是一个输入操作,因此在您展示的代码示例中,eofbit在到达if
语句时不会被设置。
如果由于某种原因(例如,一个不存在的文件)构建流失败,那么将设置failbit,可以使用fail
进行检查
编辑:看到您的编辑,我希望能更清楚地说明以上内容:
在您发布的代码中,if
条件永远不会计算为true,因为ifstream
构造函数没有设置eofbit
如果文件不存在,将设置failbit,您可以这样检查:
if (csvin.fail()) {
// oops : failed to open the file for reading (file doesn't exist, or has the wrong permissions, or ...)
}
在文件为空的情况下,构造函数不会抱怨,但流上的第一个输入操作将设置eofbit。在第一次输入操作之后,您可以使用eof
检查是否达到了文件的结尾。eof()
如果流上的最后一次操作试图读取文件的最后一个字节,则返回true
。请注意这样一个事实:它告诉你上一次手术的成功,而不是下一次手术的成功。许多代码示例错误地假设它告诉您有关下一个操作的一些信息,因此代码的行为将与预期不符。实际上还有一小部分实现依赖性
设置了eofbit
时设置为。(函数eof()
返回true
当且仅当设置了eofbit
时。)需要进行设置
如果,在阅读过程中(格式化或
未格式化),调用streambuf::sgetc()
(或
其他字符获取程序)返回std::char\u traits::eof()
。
何时实现可能会出现这种情况并不总是很清楚
字符在前面,如果它得到文件的结尾,则
设置eofbit
;如果它不做前瞻,它就不会
我也不确定实现是否可以设置eofbit
如果知道下一次读取必须返回eof
,
没有读过书;我相当肯定
然而,现有的实现没有这样做。)你真的想要吗
eofbit
在查找文件结尾时设置)因此在
例如,您几乎肯定不会看到eof()
返回
对
所有这些都解释了为什么您几乎从不执行input.eof()
(或
input.good()
,它在其值中包含eofbit
,如下所示:
嗯)。尝试打开文件后,通常情况是
if(input.is_open())
,尽管input.fail()
可以用作
好。当读取一个已经打开的文件时,我们测试
input.fail()
在尝试输入之后,通常使用
布尔上下文中的流对象(即if(输入)
,或if
(!输入)
)。在检测到故障后,我们可以使用
eof()
以确定故障原因是否为结束
文件的错误,或尝试输入时出现的其他错误(如“abc”
)
一个int
)。即使如此,它也不是100%无误的,而且eof()
may
即使格式中有错误,也返回true。
(考虑:
std::istringstream s( "1.3E+" );
double d;
s >> d;
在这种情况下,s.eof()
几乎肯定会返回true,
显示由于输入中的错误而导致输入失败的事实
通常,它是这样写的:(!csvin.eof()){do_something();}@Gearoid No.除非是“通常”,你的意思是“通常,在不完整的代码中”,你的文档会让你陷入一个循环,就像那个网站经常做的那样。把这个网站当作你的第一个来源。如果文件不存在,csvin
无效,您不应该首先尝试对其调用eof()
。@DevSolar:csvin
将是一个完全构造的对象,因此对其调用任何方法(包括eof
)都是定义良好的(alb)