是否建议始终使用'binary'模式打开文件?

Is it recommended to always open file using 'binary' mode?

本文关键字:模式 文件 binary 是否      更新时间:2023-10-16

我有一个通用函数:

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);

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

问题

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

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

有关 GCC 文档中如何解释这一点,请参阅此处。

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

由于二进制流总是比文本流更强大、更可预测,因此您可能想知道文本流的用途。为什么不简单地始终使用二进制流?答案是,在这些操作系统上,文本和二进制流使用不同的文件格式,而读取或写入可以与其他面向文本的程序一起使用的"普通文本文件"的唯一方法是通过文本流。

以文本形式打开将修改它认为的内容,即读取或写入文件时的行尾字符。对于纯文本文件,我会以文本形式打开。有两个优点。

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

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

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

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