在二进制模式下使用格式化的IO操作是否有任何问题,特别是如果我只处理文本文件?
(1):
对于二进制文件,使用提取和插入运算符(<<>>)读取和写入数据以及像getline这样的函数效率不高,因为我们不需要格式化任何数据和数据很可能不会格式化为行。
(2):
通常,对于二进制文件i / o,您不使用传统的面向文本的<<和>>运营商!它可以完成,但这是一个高级主题。
"高级主题"自然是让我混淆这两者的问题。有一个mingw bug具有seek和tell功能,可以通过以二进制模式打开来解决。使用<<是否有任何问题和>>在二进制模式下与文本模式相比,或者如果以二进制打开,我是否总是求助于未格式化的IO? As far as I can tell for text files,我只需考虑回车(\ r),这些回扣并没有为我明确删除/添加,但这是否需要考虑?
答案 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。