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

Using formatted IO operations in binary mode?

本文关键字:格式化 IO 操作 二进制 模式      更新时间:2023-10-16

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

(1) :

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

(2) :

通常,对于二进制文件i/o,您不使用传统的面向文本的<lt;和>>操作员!这是可以做到的,但这是一个高级话题。

"高级话题"的性质让我质疑将这两者混合在一起。seek和tell函数有一个mingw错误,可以通过以二进制模式打开来解决。使用<lt;和>>在二进制模式下与文本模式相比,或者如果以二进制模式打开,我必须始终使用未格式化的IO吗?据我所知,对于文本文件,我只需要考虑回车(\r),这些回车并没有被明确地删除/添加,但这就是需要考虑的全部吗?

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

我只需要说明运费返还(\r)为我删除/添加

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

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

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

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

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

二进制文件也应该有一个包含一些基本信息的头。有关这方面的更多信息,请参阅我的回答。