【问题标题】:Is it recommended to always open file using 'binary' mode?是否建议始终使用“二进制”模式打开文件?
【发布时间】:2015-06-22 06:40:08
【问题描述】:

我有一个通用函数:

bool WriteFile(const string& strFileContent, const wpath& pathFile)

在这个函数中,我有以下一行:

std::ofstream outStream(pathFile.string().c_str(), std::ios::out);

由于这个函数是通用的,我有时用它来写二进制文件。我注意到使用openmode std::ios::out 不是二进制数据的正确选择,并且写入的文件与我预期的不同,这意味着文件不等于strFileContent 中定义的实际数据。

所以我做了这个简单的修复:

std::ofstream outStream(pathFile.string().c_str(), std::ios::out | std::ios::binary);

这解决了二进制文件的问题,也适用于文本文件

问题

if 开放模式std::ios::out | std::ios::binary 适用于二进制和文本数据,其中一种不是多余的吗?
如果是这样,我应该总是使用std::ios::out | std::ios::binary吗?
如果不是,在哪些情况下不建议使用std::ios::out | std::ios::binary

【问题讨论】:

标签: c++ c++11 ofstream


【解决方案1】:

我已经阅读了一些相关的帖子,但找不到太多新内容。
除了换行符转换,我找不到任何其他喜欢文本模式的理由。
顺便说一句,在 GNU C 库和所有 POSIX 系统中,文本流和二进制流没有区别。

请参阅 here 了解 GCC 文档中对此的解释。

我真的很想找到一些关于强调文本的例子。

由于二进制流总是比文本流更有能力和更可预测,您可能想知道文本流的用途是什么。为什么不总是简单地使用二进制流? 答案是,在这些操作系统上,文本流和二进制流使用不同的文件格式,只有通过文本流才能读取或写入可以与其他面向文本的程序一起使用的“普通文本文件” .

【讨论】:

    【解决方案2】:

    以文本形式打开会在您读取或写入文件时修改它所认为的行尾字符。对于纯文本文件,我会以文本形式打开。有两个好处。

    • 代码更易于移植到其他平台。

    • 代码与源自其他平台的文件更兼容。

      因此,例如,您可能会看到对往往不包含原始二进制数据的 CVS、XML 或 HTML 文件使用文本格式的好处。

    不幸的是,这并不能保证上述方法会起作用,但在大多数情况下它会有所帮助。

    【讨论】:

      猜你喜欢
      • 2015-04-23
      • 2015-07-27
      • 2014-10-01
      • 2015-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多