以下是代码:
string fname = "/home/jack/example.csv";
ifstream csvin(fname.c_str());
if (csvin.eof()) {
do_something;
}
我的问题是:在什么情况下eof()
返回true。我有以下选择:
不幸的是documentation没有帮助,因为我不知道eofbit error state flag
的意思。我也不明白End-of-File is reached in the sequence associated with the stream
是什么意思。我假设c_str()返回一些迭代器,如果它已被某些东西使用,它可能已经到达它的结尾。但是,我感兴趣的是c_str()
的结果是新鲜的简单情况,如果文件不存在会返回什么,如果文件为空则会返回什么?
EDITED
我只是想知道上面给出的代码在两种情况下返回的内容:
答案 0 :(得分:4)
eof()将返回true。它实际上返回了 eof标志的值,该值在读取文件末尾(尝试读取过去)时设置。查看C++: .eof on an empty file以获取关于eof和空文件的讨论!
答案 1 :(得分:2)
eof
返回true
(表示在ifstream
的情况下到达文件的末尾)。
当输入操作尝试读取流的末尾时,可以通过流上的所有输入操作(例如,read
)设置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
检查是否已到达文件的末尾。
答案 2 :(得分:1)
eof()
返回true
。注意它会告诉你最后一次操作成功的事实,而不是下一次操作成功的事实。许多代码示例都做出了错误的假设,即它会告诉您有关下一个操作的信息,因此代码将无法按预期运行。
答案 3 :(得分:1)
实际上存在一定程度的实现依赖性
设置eofbit
时的时间。 (函数eof()
返回true
当且仅当eofbit
已设置。)需要设置
如果,在阅读过程中(格式化或
未格式化的,呼叫streambuf::sgetc()
(或其中一个
其他角色getters)返回std::char_traits::eof()
。
并不总是清楚实现可能看起来如何
前面的字符 - 如果文件结束这样做,它
集eofbit
;如果不进行预测,则不会。
我也不确定实施是否可以设置eofbit
如果它知道下一个读取必须返回eof
,
没有实际阅读;我很确定
但是,现有的实现不会。 (你真的想要吗?
当你寻找到文件的末尾时设置eofbit
?)所以在你的
例如,你几乎肯定不会看到eof()
返回
真。
所有这些都解释了为什么你几乎从不做input.eof()
(或
input.good()
,其中包含eofbit
的值
好)。在尝试打开文件后,通常的情况是
if ( input.is_open() )
虽然input.fail()
可以用作
好。在阅读已打开的文件时,我们进行测试
1>} 在尝试输入后,通常使用
布尔上下文中的流对象(即input.fail()
或if ( input )
)。 在检测到故障后,我们可能会使用
if
( !input )
确定失败的原因是否结束
当尝试输入时,文件或其他一些错误(如eof()
)
"abc"
)。即使这样,它也不是100%绝对可靠的,int
可能
即使格式中存在错误,也返回true。
(考虑:
eof()
在这种情况下,std::istringstream s( "1.3E+" );
double d;
s >> d;
几乎肯定会返回true,
由于错误导致输入失败这一事实
由于文件结束,格式和不。)