使用ifstream、ofstream或fstream进行输入和输出

16

在处理文件时,下面两个示例中哪一个更好?它们的性能是否有所不同?

ifstream input("input_file.txt");
ofstream output("output_file.txt");

对比

fstream input("input_file.txt",istream::in);
fstream output("output_file.txt",ostream::out);

4
在期望 ostream 的地方使用 istream 会导致错误,如果你意外使用了以输入模式打开的 fstream,编译器不会抱怨,因此请注意避免这种情况,这将避免许多不必要的麻烦。 - user657267
2个回答

27

从性能上来看,在这种情况下可能只有可忽略的差异。最多你可以节省一点内存。

重要的是第一种情况可以帮助语义理解:一个 std::fstream 可以被打开为输入、输出或两者兼备。因此在使用 std::ifstreamstd::ofstream 时需要检查声明才能确定具体操作。而第二种情况容易出错,应该避免使用。

我的经验之谈是,仅当需要同时读写文件时才使用 std::fstream


1
除非您需要不同的行为,否则请使用更简洁的形式...否则只会为更多错误留下空间。顺便说一句,如果可能的话,我更喜欢范围限定流并检查打开是否有效,就像这样:
if (std::ifstream input{"input_file.txt"})
    ...use input...
else
    ...log and/or throw...

您是否也建议使用文件检查方法而不是“if(input.is_open())”? - Ishaan
@ishyfishy:绝对没错 - 我不记得上一次使用is_open()是什么时候了。 - Tony Delroy
1
这个方法有几个有趣的点:流只会在 if 结束之前存在,所以你不必担心忘记关闭文件,而且你可以利用流的隐式转换为布尔值。 - meneldal
请注意,此答案引发了另一个问题,而且似乎这种语法并不完全有效。但是,花括号初始化在C++11及更高版本中可以使用。 - Fred Larson
2
@FredLarson:谢谢 - 之前我可能使用了一些编译器的非标准扩展来接受括号,但最近发现自己需要使用大括号。答案已相应更新。干杯。 - Tony Delroy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接