我有运行时可能打开的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;
}
谢谢!
答案 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
来测试流是否打开,但由于上述原因你不需要它。