gpt4 book ai didi

c++ - 为什么标准同时有 seekpos() 和 seekoff()?

转载 作者:IT老高 更新时间:2023-10-28 22:59:25 26 4
gpt4 key购买 nike

标题几乎说明了一切。

我正在实现自己的 streambuf 类,我想知道委员会在决定同时包含 std::streambuf::seekpos()std::streambuf 时的想法::seekoff()(对于相关的 pubseekpos()pubseekoff() 也是如此)。

在我看来 seekpos(x) 在我能想象的每一种情况下都应该与 seekoff(x, std::ios::beg) 具有相同的效果.但也许我的想象力还不够好。那么,当 seekpos 完全被 seekoff 包含时,为什么要同时拥有这两者呢?或者至少,你为什么不让前者的默认实现简单地调用后者?

如果答案是“因为那是 STL 所做的”或类似的,那么假设我在询问 STL 或类似的基本原理。

(我意识到 seekpos 的第一个参数是 streamposseekoff 的第一个参数是 streamoff。但请注意,27.4.3.2 [lib.fpos.operations] 要求流位置可转换为流偏移量并返回,所以我认为这不是答案。)

最佳答案

这两个函数使用不同的参数:

您完全正确:它们可以双向转换。但存在细微的语义差异:

  • streampos 直观地与固定位置相关,而 streamoff 在某种程度上与文件中的运动相关。
  • 从另一个 streampos 中减去一个 streampos 得到一个 streamoff
  • streampos 添加到 streamoff 会生成新的 streampos
  • 由于易于转换,其他组合也有效,但需要更加小心。
  • 宽流使用 wstreampos 作为位置(因为显然 wchar_t 中的位置与 char 流中的位置具有不同的含义)。
  • 但宽流使用 streamoff 进行运动,因为它是相对于位置的相对运动。

如果您使用模板编程,这些语义差异在特征上更加明显:S::pos_typeS::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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com