- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
标题几乎说明了一切。
我正在实现自己的 streambuf 类,我想知道委员会在决定同时包含 std::streambuf::seekpos()
和 std::streambuf 时的想法::seekoff()
(对于相关的 pubseekpos()
和 pubseekoff()
也是如此)。
在我看来 seekpos(x)
在我能想象的每一种情况下都应该与 seekoff(x, std::ios::beg)
具有相同的效果.但也许我的想象力还不够好。那么,当 seekpos
完全被 seekoff
包含时,为什么要同时拥有这两者呢?或者至少,你为什么不让前者的默认实现简单地调用后者?
如果答案是“因为那是 STL 所做的”或类似的,那么假设我在询问 STL 或类似的基本原理。
(我意识到 seekpos
的第一个参数是 streampos
而 seekoff
的第一个参数是 streamoff
。但请注意,27.4.3.2 [lib.fpos.operations] 要求流位置可转换为流偏移量并返回,所以我认为这不是答案。)
最佳答案
这两个函数使用不同的参数:
您完全正确:它们可以双向转换。但存在细微的语义差异:
streampos
直观地与固定位置相关,而 streamoff
在某种程度上与文件中的运动相关。streampos
中减去一个 streampos
得到一个 streamoff
。streampos
添加到 streamoff
会生成新的 streampos
。wstreampos
作为位置(因为显然 wchar_t
中的位置与 char
流中的位置具有不同的含义)。streamoff
进行运动,因为它是相对于位置的相对运动。如果您使用模板编程,这些语义差异在特征上更加明显:S::pos_type
和 S::off_type
。
不管这些语义上的微妙之处,这种差异的真正起源是历史的,并且与 C 标准库有关,正如 Plauger 先生在 this article 中所解释的那样:
streamoff
是用 fseek()
设计的和记住 C 标准库的 ftell()
,它使用 long
进行定位。streampos
用于 fgetpos()
和使用 fpos_t
参数的 fsetpos()
。我可以验证这在 C89 标准中已经存在。由于在最初的 K&R 中没有提到这两个函数,也许 UNIX 历史学家可以讲述更多关于更遥远的路径。
This paper解释了标准委员会最近的想法。似乎历史差异受到质疑,并且是否仍然真的需要它已不再清楚。
关于c++ - 为什么标准同时有 seekpos() 和 seekoff()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29132458/
在[filebuf.virtuals] : pos_type seekoff(off_type off, ios_base::seekdir way, ios_bas
标题几乎说明了一切。 我正在实现自己的 streambuf 类,我想知道委员会在决定同时包含 std::streambuf::seekpos() 和 std::streambuf 时的想法::seek
我有以下实现基于例如this question and answer struct membuf : std::streambuf { membuf(char* begin, char* end)
我正在创建自己的 streambuf 子类并使用 C++03 规范 (ISO/IEC 14882:2003) 作为引用。 在第 27.5.2.4.2 节 [lib.streambuf.virt.buf
27.6.3.4.2 Buffer management and positioning pos_type seekoff(off_type off, ios_base::seekdir way,
我公司的产品运行在许多合格的 Linux 硬件/软件配置上。从历史上看,使用的编译器是 GNU C++。出于本文的目的,让我们将版本 3.2.3 视为基线,因为我们的软件在该版本中“按预期工作”。 随
我是一名优秀的程序员,十分优秀!