关闭未打开的流

时间:2010-09-16 17:39:27

标签: c++

我有运行时可能打开的ifstream和ofstream(取决于用户在命令行中输入的内容。无论如何我都声明了变量,并且我有一个方法可以在需要时打开流。 我的问题是在程序结束时我不知道是否需要关闭它们。

无论如何在c ++中知道是否打开了流?就像在Java中一样,您可以为流提供null值,然后询问它是否为null(这意味着它从未打开过)..

关闭一个从未打开过的流是否可以?

这是代码:

int main(int argc, char* argv[]) {

    static std::ifstream ifs;
    static std::ofstream ofs;

        //might or might not open the streams:
    OpenStreams(ifs,ofs,argc-1,argv);
        ........

        //here i would like to close the streams at the end of the program
        //or not (if they were not opened

    return 0;

}

谢谢!

6 个答案:

答案 0 :(得分:3)

我真的不知道,也不在乎。只需将其留给析构函数,标准文件流将在销毁期间关闭文件(如果需要)。

编辑:关于物体的寿命和有保障的破坏......

为了跟进我写给Ben Voigt的第二条评论,这是对物体生命周期的一个小测试:

#include <cstdlib>
#include <iostream>
#include <string>

struct test {
    std::string name;
    test( std::string const & name ) : name(name) {
        std::cout << "test " << name << std::endl;
    }
    ~test() { std::cout << "~test " << name << std::endl; }
};

void foo( bool exit ) {
    test t1( "1" );
    static test t2( "2" );
    test t3( "3" );
    if ( exit ) {
        std::exit(1);
    }
}
int main()
{
    foo(false);
    std::cout << std::endl;
    foo(true);
}

执行结果:

test 1
test 2
test 3
~test 3
~test 1

test 1
test 3
~test 2

可以看出,在第一次执行期间,foo中对象的构造与代码的顺序相同。但是当函数退出时,只有具有auto存储的对象被销毁,使用static存储的对象超过函数执行。

在对foo的第二次调用中,auto对象被重新创建,而static对象没有按预期进行,因为它是在之前的调用中创建的。由于foo在第二次调用中调用了exit(),因此auto中的foo个对象不会被破坏。另一方面,static对象被正确销毁。

答案 1 :(得分:1)

为什么不在发出is_open()之前使用close()对此进行测试?

答案 2 :(得分:0)

只是不要制作变量static,这样他们会在main()返回时自动关闭。

答案 3 :(得分:0)

您可以使用is_open方法测试是否已打开流,然后将其关闭。

答案 4 :(得分:0)

为什么不在打开流之前设置标志。如果需要关闭流对象,请再次检查标志。

最好是在打开流时将该开放流对象传递给该标记&amp;用它来关闭流。如果标志尚未初始化或为null则不关闭。

答案 5 :(得分:0)

不需要close调用 - 当它们被销毁时,它们会在打开时自行关闭。此外,static看起来很可疑。 main只被调用一次,所以它在这里没有任何影响(除了迂腐的标准差异,这里没关系,我认为......绝对不是在所示的情况下)。

也就是说,如果没有打开流,你可以调用close - 如果它没有打开, close将返回一个空指针。(我正在寻找在basic_filebuf<>::close的规范中 - 文件流的close返回void)。

文件流也可以处理非开放流:如果流未打开,则设置failbit。您可以使用fail()检查该内容(在设置failbit或badbit时进行测试)。但是无论如何都有is_open来测试流是否打开,但由于上述原因你不需要它。