【发布时间】:2012-01-04 01:43:36
【问题描述】:
我一直在尝试阅读 iostream 并更好地理解它们。有时我发现它强调插入器 (<<) 和提取器 (>>) 旨在用于 textual 序列化。有几个地方,但这篇文章就是一个很好的例子:
http://spec.winprog.org/streams/
在<iostream> 世界之外,有些情况是> 以类似流的方式使用,但不遵守任何文本约定。例如,当 Qt 的 QDataStream 使用时,它们会写入二进制编码数据:
http://doc.qt.nokia.com/latest/qdatastream.html#details
在语言级别,> 运算符属于您的项目以进行重载(因此 QDataStream 所做的事情显然是可以接受的)。我的问题是,对于那些使用 <iostream> 的人来说,使用 > 运算符来实现二进制编码和解码是否被认为是一种不好的做法。是否有(例如)任何期望,如果将文件写入磁盘上的文件,该文件应该可以使用文本编辑器查看和编辑?
是否应该始终使用其他方法名称并将它们基于read() 和write()?还是应该将文本编码仅视为与标准库 iostream 集成的类可以选择忽略的默认行为?
更新 这方面的一个关键术语问题似乎是区分“格式化”与“未格式化”的 I/O(与术语“文本”与“二进制”相对)。我发现了这个问题:
writing binary data (std::string) to an std::ofstream?
@TomalakGeret'kal 有一条评论说 “无论如何我都不想将
对该问题的公认答案是,只要您使用ios::binary 就可以了。这似乎支持了辩论中“没有任何问题”的一面......但我仍然没有看到任何关于这个问题的权威来源。
【问题讨论】:
-
“文本编码”是一个误导性术语。我会说,“格式化 I/O”更合适。
-
无论你的框架做什么。
-
@KerrekSB 我对“文本编码”排除的内容比“格式化 I/O”排除的内容有更清晰的认识。如果我有一个包含 N 个 32 位整数的对象,那么使用
write()为 N 输出 4 个字节,然后输出对应于值的 4*N 个字节……这仍然是“格式化”的吗? -
不,
write()输出未格式化的数据,因此整数的实际二进制(实现)表示按原样插入到输出流中。相比之下,“格式化”可能类似于创建整数 值 的文本表示,然后将(二进制表示的)文本插入到输出中。 -
@KerrekSB 与我试图解决的更大问题相比,我仍然无法判断您对“文本编码”短语的反对是严重还是次要问题。但是,与其在这里聊天,您是否介意阅读我的问题的字里行间并发布回复(尽您的能力)引用来源并解决它?我说的是一个可靠的“不要那样做”的论点,以帮助人们提出这样的建议:stackoverflow.com/q/1157469/211160
标签: c++ text iostream binary-data