【问题标题】:std::ifstream in binary mode and locale in C++二进制模式下的 std::ifstream 和 C++ 中的语言环境
【发布时间】:2017-05-13 07:54:11
【问题描述】:

James Kanze 在How to copy a .txt file to a char array in c++ 上的评论听起来像是为了确保标准字符串在被标准字符串构造函数迭代时能够获得文件的确切二进制内容,必须两者兼而有之:

  • 以二进制模式打开文件,
  • 确保文件使用“C”语言环境。

在代码中,我猜这意味着:

std::ifstream in(filename, ios_base::binary);
in.imbue(std::locale("C"));

真的有必要吗?更具体地说,当文件以二进制模式打开时,为什么语言环境会产生任何影响?

请注意,我正在尝试做的或多或少是上述问题的内容:

std::string contents(std::istreambuf_iterator<char>(in), std::istreambuf_iterator<char>());

【问题讨论】:

  • 你应该做一些研究 ios_base::binary 究竟做了什么。它或多或少只与 Windows 操作系统相关。
  • @πάντα,引用您的链接:“二进制流是可以透明地记录内部数据的有序字符序列。从二进制流中读取的数据始终等于之前写入的数据那个流”。你的意思是在这种情况下,灌输语言环境没有影响(这是我的问题的重点——显然是愚蠢的……)?
  • 似乎在某些情况下可能相关:stackoverflow.com/a/208431/1413395
  • @πάντα:感谢附加链接,但它涉及使用二进制流将宽字符写入文件。我看不出它如何适用于我的情况。我只希望我的文件中的字节最终在我的字符串中而不进行转换。同样,我的基本假设是,无论语言环境如何,以二进制模式打开文件都可以实现这一点。如果有的话,我很乐意听到反对该假设的实际论据。 James Kanze 说得好像有一些。
  • 我不完全相信 Kanze 在该评论中完全正确。 locale 的char -&gt; char 转换应该是身份转换。

标签: c++ string file iterator locale


【解决方案1】:

基于binary and text modes:

二进制流是可以透明地记录内部数据的有序字符序列。从二进制流中读取的数据始终等于之前写入该流的数据。实现只允许在流的末尾附加一些空字符。

我认为

std::ifstream in(filename, ios_base::binary);

与:

in.imbue(std::locale("C"));

没有意义。

要么流处于二进制模式,并且区域设置不适用,要么程序员选择设置区域设置,但随后他/她隐含地表示流以文本模式打开(ios_base::binary 不应传递到流构造函数)。在这种情况下,读取的数据可能与文件中的数据相等,也可能不相等,具体取决于操作系统和文件的内容。

【讨论】:

    猜你喜欢
    • 2021-11-27
    • 1970-01-01
    • 1970-01-01
    • 2011-01-22
    • 2019-06-25
    • 2018-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多