2016-01-06 81 views
2

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

(1)

对于二进制文件,阅读和与提取和插入运算符(< <和>>)和函数写数据,如函数getline是没有效率的,因为我们并不需要格式化的任何数据并且数据可能不会按行格式化。

(2)

通常情况下,二进制文件I/O不使用传统的面向文本的< <和>>运算!它可以完成,但这是一个高级话题。

“高级话题”的本质是让我质疑这两者的混合。有一个mingw bug与查找和告诉功能可以解决打开二进制模式。使用< <和>>在二进制模式下与文本模式相比是否存在任何问题,或者如果打开二进制文件,我是否必须始终使用未格式化的IO? As far as I can tell for text files,我只需要考虑回车符(\ r),这些回车符不会被隐式删除/添加给我,但是所有这些都是要考虑的吗?

+0

文件的*二进制模式*表示在读取或写入文件('ios :: binary')时不会发生翻译。一种常见的翻译是行结尾。这与使用'istream :: read'和'ostream :: write'直接读取和写入未格式化的数据不同。 –

回答

0

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

我只是必须考虑回车符号(\ r)不是 implictly删除/添加我

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

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

二进制文件的另一个优点是你不必做任何解析。您可以直接访问所有数据,无论文件在哪里(假设数据以良好结构存储)。例如:如果您需要存储记录,每个记录包含5个32位数字,则可以将这些记录直接写入二进制文件,以其原始二进制格式(不会浪费时间进行转换和解析)。例如,稍后要读取记录nr 1000,您可以直接将seek定位到5 x 4 x(1000-1)的位置,然后从那里读取您的20字节记录。另一方面,使用文本文件时,您需要扫描文件开始处的每个字节,直到您计算了1000行(也将具有不同的长度)。

你会使用read()write()(或fread()/fwrite())直接(虽然<<>>可以太用于具有可变长度的对象serialization)。

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

+0

_“二进制文件还应该有一个包含一些基本信息的标头。”_在某些子集的情况下。说这是一个普遍的规则充其量是乐观的。 –