在二进制模式下使用格式化IO操作?

时间:2016-01-06 19:16:19

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

在二进制模式下使用格式化的IO操作是否有任何问题,特别是如果我只处理文本文件?

(1)

  

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

(2)

  

通常,对于二进制文件i / o,您不使用传统的面向文本的<<和>>运营商!它可以完成,但这是一个高级主题。

"高级主题"自然是让我混淆这两者的问题。有一个mingw bug具有seek和tell功能,可以通过以二进制模式打开来解决。使用<<是否有任何问题和>>在二进制模式下与文本模式相比,或者如果以二进制打开,我是否总是求助于未格式化的IO? As far as I can tell for text files,我只需考虑回车(\ r),这些回扣并没有为我明确删除/添加,但这是否需要考虑?

1 个答案:

答案 0 :(得分:0)

  

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

     

我只需考虑回车(\ r)而不是   为我隐含地删除/添加

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

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

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

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

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

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