【问题标题】:ifstream and ofstream or fstream using in and outifstream 和 ofstream 或 fstream 使用 in 和 out
【发布时间】:2015-08-03 23:45:18
【问题描述】:

在处理文件时,以下两个示例中的哪个是首选? 一个提供比另一个更好的性能吗?有什么区别吗?

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

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

【问题讨论】:

  • 使用istream 预期ostream 会导致错误,如果您不小心使用在输入模式下打开的fstream ,编译器不会抱怨。

标签: c++ fstream ifstream ofstream


【解决方案1】:

除非您需要不同的行为,否则请使用更简洁的形式......否则只是为更多错误创造空间。 FWIW,如果可能的话,我更喜欢对流进行范围检查并检查打开是这样的:

if (std::ifstream input{"input_file.txt"})
    ...use input...
else
    ...log and/or throw...

【讨论】:

  • 您是否还建议在“if (input.is_open())”上使用该文件检查方法?
  • @ishyfishy:当然——我不记得我上次使用is_open()是什么时候了。
  • 这个方法有几个有趣的点:流只会持续到if 结束,所以你不必担心忘记关闭文件,你可以使用隐式转换为流的布尔值。
  • 请注意,这个答案生成了another question,而且这个语法似乎不太有效。不过,大括号初始化适用于 C++11 及更高版本。
  • @FredLarson:谢谢 - 一定是我在接受括号之前使用的某些编译器的非标准扩展,但最近发现自己需要使用大括号。答案相应更新。干杯。
【解决方案2】:

在性能方面,在这种情况下可能只有微不足道的差异。充其量只是节省一点内存。

重要的是第一种情况有助于语义:std::fstream 可以在输入、输出或两者中打开。因此,您需要检查声明以确保在使用std::ifstreamstd::ofstream 时会清楚地说明您在做什么。第二种情况有更多的人为错误空间,因此应该避免。

我自己的经验法则是当您需要对文件进行读写访问时使用std::fstream,并且仅在这种情况下。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-23
    • 1970-01-01
    • 1970-01-01
    • 2018-11-21
    相关资源
    最近更新 更多