【发布时间】: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 -> char转换应该是身份转换。
标签: c++ string file iterator locale