【问题标题】:Using formatted IO operations in binary mode?在二进制模式下使用格式化的 IO 操作?
【发布时间】:2016-04-11 00:11:07
【问题描述】:

在二进制模式下使用格式化的 IO 操作有什么问题,尤其是当我只处理文本文件时?

(1):

对于二进制文件,使用提取和插入运算符(>)以及 getline 之类的函数读取和写入数据效率不高,因为我们不需要格式化任何数据,而且数据很可能没有按行格式化。

(2):

通常,对于二进制文件 i/o,您不使用传统的面向文本的 > 运算符!它可以做到,但这是一个高级主题。

“高级主题”的性质让我质疑将这两者混合在一起。有一个 mingw bug 带有 seek 和 tell 功能,可以通过以二进制模式打开来解决。与文本模式相比,在二进制模式下使用 > 是否有任何问题,或者如果以二进制打开,我必须始终使用未格式化的 IO? As far as I can tell for text files,我只需要考虑回车符 (\r),这些回车符 (\r) 并没有为我隐式删除/添加,但这就是所有需要考虑的吗?

【问题讨论】:

  • 文件的二进制模式意味着在读取或写入文件时不会发生翻译 (ios::binary)。一种常见的翻译是行尾。这与使用istream::readostream::write 直接读写无格式数据不同。

标签: c++ c++11 binary iostream


【解决方案1】:

在二进制中使用格式化的IO操作有什么问题吗 模式,特别是如果我只处理文本文件?

我只需要考虑回车 (\r) 为我隐式删除/添加

如果您想要或需要数据中的\r,您可能正在处理文本/字符串。为此,您不需要使用二进制文件。尽管您可以以二进制模式打开文本文件以快速扫描换行符(例如行数),而不必执行效率较低的readline()

二进制文件用于直接存储二进制值(主要是数字或数据结构),无需将它们转换为文本再转换回二进制。

二进制文件的另一个优点是您不必进行任何解析。您可以直接访问所有数据,无论它在文件中的什么位置(假设数据以结构良好的方式存储)。

例如:如果您需要存储记录,每条记录包含 5 个 32 位数字,您可以将这些记录以它们的原生二进制格式直接写入二进制文件(无需浪费时间进行转换和解析)。例如,以后要读取记录 nr 1000,您可以直接seek 到位置 5 x 4 x (1000-1),并从那里读取您的 20 字节记录。另一方面,对于文本文件,您需要从文件开头扫描每个字节,直到数完 1000 行(with 也将具有不同的长度)。

您可以直接使用read()write()(或fread() / fwrite())(尽管<<>> 也可以用于具有可变长度的对象的serialization)。

二进制文件还应该有一个包含一些基本信息的标题。有关更多信息,请参阅my answer here

【讨论】:

  • “二进制文件也应该有一个包含一些基本信息的标题。” 在某些情况下。将此作为一般规则说得最好是乐观的。
猜你喜欢
  • 1970-01-01
  • 2011-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-23
  • 1970-01-01
  • 2011-12-16
相关资源
最近更新 更多