【问题标题】:C++ fstream << and >> operators with binary data具有二进制数据的 C++ fstream << 和 >> 运算符
【发布时间】:2010-11-19 16:18:49
【问题描述】:

我一直阅读并被告知,在处理二进制文件时,应该使用 read() 和 write() 而不是 > 运算符,因为它们是用于格式化数据的。我还读到可以使用它们,但这是一个高级主题,我找不到任何人深入和讨论的地方。

我最近看到了一些执行以下操作的代码:

std::ifstream file1("x", ios_base::in | ios_base::binary); std::ofstream file2("y", ios_base::app | ios_base::binary); 文件 1

当我指出在二进制文件中使用

这是真的并且安全吗?效率如何?有什么陷阱吗?非常感谢详细信息。

谢谢!

【问题讨论】:

    标签: c++ iostream standard-library


    【解决方案1】:

    是的(参见 27.6.2.5.3/6,其中描述了

    【讨论】:

    • 这是标准中的页面还是什么? :) 一个链接会很好!
    • 这是对标准中一个段落的引用。该标准本身并不公开。有些草稿是,但我手边没有链接。
    • 好的,感谢您的澄清。他们应该公开标准。
    • 出售它是他们赚钱的方式,所以不太可能。虽然我同意,但会很好。 98 版本的后期草稿可在ftp.research.att.com/pub/c++std/WP/CD2 获得
    • “他们”是谁? ISO 和国家机构不是盈利组织。他们从销售标准中获得的钱支付了他们的运营成本,而流行的标准实际上支持不太流行的标准。委员会成员和他们的雇主已经支持这一过程,他们付出时间、支付会议的旅行和住宿费用、赞助会议以提供房间等,而且通常支付会员费。这种安排并不是真正为 PL 设计的,但 PL 对这些组织来说是一个非常特殊的领域,例外处理对他们来说没有意义。
    【解决方案2】:

    复制流是完全安全且合理的方式。

    请注意,它还允许以下内容:

    std::ifstream file_in1("x1", ios_base::in | ios_base::binary);
    std::ifstream file_in2("x2", ios_base::in | ios_base::binary);
    std::ofstream file_out("y", ios_base::app | ios_base::binary);
    
    file_out << file_in1.rdbuf() << "\nand\n" << file_in2.rdbuf();
    

    【讨论】:

    • 你有详细说明为什么这是安全的吗?我知道你可以做到这一点并且它似乎有效,但我的好奇心在于看到引用声明 > 不适用于二进制数据的地方是很常见的事情。例如,这是否适用于以二进制形式打开的文本文件以及相同的图像?
    • > 是重载运算符。也就是说,有很多实现。通常,这些用于文本并将格式化它们的第二个操作数。但是,streambuf 重载与所有其他重载有着根本的不同。
    【解决方案3】:

    在 C++ 标准的第 27.7.3.6.3 节中提到了
    basic_ostream<charT,traits>& operator<< (basic_streambuf<charT,traits>* sb);
    Effects: Behaves as an unformatted output function (as described in 27.7.3.7, paragraph 1).

    § 27.7.3.7 描述了基本上是二进制副本的“未格式化输入”。这意味着“未格式化”的 ostream 函数对于二进制数据是安全的。我能找到的标准中提到的其他“未格式化”函数是putwrite 和(官方)flush

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-09-04
      • 1970-01-01
      • 2010-09-23
      • 2019-04-24
      • 2011-05-19
      • 2017-11-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多