在二进制模式下使用格式化的IO操作
Using formatted IO operations in binary mode?
在二进制模式下使用格式化的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()
)(尽管<<
和>>
也可以用于可变长度对象的序列化)。
二进制文件也应该有一个包含一些基本信息的头。有关这方面的更多信息,请参阅我的回答。
- Seg Fault Issue C++ (file IO / getline)
- 如何防止 c++ 在从浮点型转换为双精度型(不适用于 IO)时添加额外的小数?
- 为什么在读取文件大小时文件IO速度会发生变化
- C++格式化输出问题
- 格式化浮点值:返回默认值
- 自动格式化程序> >更改为>>
- 如何从C++中的格式化字符串派生整数?
- 将从格式化文本文件读取的文本数据存储到链表
- Agora.io 虚幻引擎插件构建错误
- 在不使用系统的情况下从C++应用程序格式化 Linux 中的 SD 卡
- 高精度双精度的 Sprintf 格式化问题
- 如何在 c++ 中格式化和访问 2D 矢量数组中的数据
- 叮当格式化程序多行格式配置错误
- 如何格式化我的文本文件以使其不会一遍又一遍地重复同一行?
- 不将数据 socket.io c++(客户端)发送到 nodejs(服务器)socket.io
- 从函数(不抛出函数)返回异常以进行消息格式化?
- ASIO signal_set多个 IO 线程不可靠,具体取决于代码顺序?
- 从格式化输入操作中获取读取字符数
- 通过 Tor 服务C++ socket.io 客户端
- 在二进制模式下使用格式化的IO操作