成功打开但不好? 在C++中,有一个例子: STD::IFStWORD OPEN()/CODE >可以成功,但是 STD::IFFSUTH GOUTE()/CUT>可以是false?< /P>
编辑:使用g++4.7.1进行测试成功打开但不好? 在C++中,有一个例子: STD::IFStWORD OPEN()/CODE >可以成功,但是 STD::IFFSUTH GOUTE()/CUT>可以是false?< /P>,c++,file,stream,C++,File,Stream,编辑:使用g++4.7.1进行测试 #include <iostream> #include <fstream> int main(int argc, char *argv[]) { std::ifstream filestream("testfile"); std::cout<<filestream.good()<<std::endl; std::cout<<filestream.eof()<<st
#include <iostream>
#include <fstream>
int main(int argc, char *argv[])
{
std::ifstream filestream("testfile");
std::cout<<filestream.good()<<std::endl;
std::cout<<filestream.eof()<<std::endl;
std::cout<<filestream.fail()<<std::endl;
std::cout<<filestream.bad()<<std::endl;
return 0;
}
#包括
#包括
int main(int argc,char*argv[])
{
std::ifstream filestream(“testfile”);
std::cout如果文件为空,则会触发eofbit,但文件仍将打开,因此是。在验证标准中的实际文本后,我认为不允许在打开后设置eofbit
:如果实际打开引发异常,则可能会设置badbit
(我认为标准并没有真正说明在这种情况下应该发生什么);failbit
应该在打开失败时设置,或者如果打开后的seek(如果ate
设置)失败时设置;但是似乎没有任何情况下可以设置eofbit
在这种情况下,调用std::istream::good()
并不是一个好的解决方案。(了解OP试图实现的目标会很有趣。不管是什么,调用std::istream::good()
可能不是正确的解决方案。)
如果std::ifstream::good()
返回false
,则下一次输入将失败。
如果返回true
,则不会告诉您任何信息:下一次输入可能会成功,
但是它也可能会失败。如果流::open
返回void,那么请注意您所说的“成功”的确切含义
该标准规定了基本\u ifstream::open
(27.9.1.9):
效果:调用rdbuf()->open(s,mode | ios_base::in)
不返回空指针调用clear(),否则调用
设置状态(failbit)(可能引发ios_base::failure)
因此,如果对filebuf的open调用返回一个指示成功的值,则ifstream::open
清除所有错误位,因此good()
必然返回true
如果对filebuf的open调用返回一个指示失败的值,则ifstream::open
仍然可以返回而不引发异常。此行为可能与“success”混淆,但在这种情况下good()
返回false,因为设置了failbit
我不完全清楚为什么这会造成失败,而不是坏处,但我不认为我缺乏理解会妨碍报告事实:-)我的理解是,只有当操作试图读取超过文件末尾时,才设置eofbit。这不正确吗?@templatetypedef我不确定。如果文件为空,可以确定实现不需要设置eofbit
,但我不确定不允许设置。如果设置了eofbit
,这意味着由于没有数据,下一次输入将失败。(如果未设置eofbit
,则没有任何意义。)根据我的标准读数,这是不正确的。当基础文件缓冲区的open()
成功时,文件流中的所有状态位都将被清除。如果文件缓冲区open(),则状态设置为failbit
失败。无论哪种方式,调用文件流open()后,eofbit
将被清除
。我刚刚测试过它,使用g++4.7.1,如果你打开一个空文件:good=TRUE
,eof=fail=bad=FALSE
。这正常吗?+1在你尝试读取并且读取失败之前,实现可能实际上不会测试文件。@DavidRodríguez dribeas一般来说,直到输入失败。std::ifstream::good()
测试eofbit
(以及其他状态位)让它变得毫无价值。我不认为提问者使用good
有什么害处,是吗?只是因为eofbit
没有设置,你不妨像正常一样测试流的真实性。我想做一些毫无意义的异常操作会对可读性造成伤害,就像你所说的的任何使用>good
是毫无意义的异常…@SteveJessop在这种特殊情况下,good
实际上是可用的,因为它保证eofbit
是假的。但是它发送给读者的消息(你不知道iostreams)仍然存在。任何时候你都可以使用“规范”解决方案,您应该这样做,因为做其他事情会发出一个信息,要么您不知道情况,要么它有一些特殊之处,这意味着无法使用规范解决方案。