Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
成功打开但不好? 在C++中,有一个例子: STD::IFStWORD OPEN()/CODE >可以成功,但是 STD::IFFSUTH GOUTE()/CUT>可以是false?< /P>_C++_File_Stream - Fatal编程技术网

成功打开但不好? 在C++中,有一个例子: STD::IFStWORD OPEN()/CODE >可以成功,但是 STD::IFFSUTH GOUTE()/CUT>可以是false?< /P>

成功打开但不好? 在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

编辑:使用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()<<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)仍然存在。任何时候你都可以使用“规范”解决方案,您应该这样做,因为做其他事情会发出一个信息,要么您不知道情况,要么它有一些特殊之处,这意味着无法使用规范解决方案。