C++ basic_streambuf::seekoff指定ios_base::in | ios_base::out时应返回什么?

C++ basic_streambuf::seekoff指定ios_base::in | ios_base::out时应返回什么?,c++,iostream,streambuf,C++,Iostream,Streambuf,27.6.3.4.2缓冲区管理和定位 pos_type seekoff(off_type off, ios_base::seekdir way, ios_base::openmode which = ios_base::in | ios_base::out); 效果:改变一个或多个区域内的流位置 控制序列的方式是分别为每个 根据本条(27.8.2.4, 27.9.1.5) 默认行为:返回位置类型(关闭类型(-1)) 到目前为止,一切顺利。我使用的basic\u streambuf派

27.6.3.4.2缓冲区管理和定位

pos_type seekoff(off_type off, ios_base::seekdir way,
    ios_base::openmode which = ios_base::in | ios_base::out);
  • 效果:改变一个或多个区域内的流位置 控制序列的方式是分别为每个 根据本条(27.8.2.4, 27.9.1.5)
  • 默认行为:返回位置类型(关闭类型(-1))
到目前为止,一切顺利。我使用的
basic\u streambuf
派生可以分别改变其在
ios\u base::in
和/或
ios\u base::out
中的位置。但是,当两者都指定时,我需要返回什么


如果您指定了
ios\u base::in
,我们将返回特定序列的新流位置。

由流来定义发生了什么。内置流的不同之处在于,一些流可以有单独的读写位置(stringstream),而另一些流只有一个(fstream)


如果用户进行了重新定位并同时指定了“入”和“出”,也许您应该同时移动这两个位置。如果是以零偏移量寻道以获得当前位置,则如果位置不同,则失败并非不合理。

根据27.8.2.4中的seekoff,您似乎会失败

检查条件表130,其中规定只有在以下情况下,才应定位输入和输出序列

(which & (ios_base::in | ios_base::out)) == (ios_base::in) | ios_base::out))
and way == either ios_base::beg or ios_base::end

另一种选择是按偏移量移动两者,但我不知道应该返回什么。我认为你是对的,如果立场不同,失败是最合理的。“以一种对每个类分别定义的方式”这是一个规范,还是一个笑话?@curiousguy-即使听起来很奇怪,它确实是一个规范。它允许派生类以一种合理的方式运行,这种方式在不同的实现和用例之间可能有所不同。然而,实现“应该”如何运行并不总是那么直观。它确实是一个规范,但它不是。这是对其他地方其他规范的暗示。“它允许派生类以一种合理的方式运行,在不同的实现和用例之间可能会有所不同。”这个“规范”有什么意义?知道
seekoff
以一种为每个派生类分别定义的方式改变一个或多个受控序列中的流位置,可以做什么?@curiousguy-从自上而下的角度看,您不知道实际实现:您不知道流位置是如何改变的。但是这个概念允许不同的实现,表现得像一个
streambuf
,但在位置处理上保持灵活。使用
basic\u streambuf::seekoff
,您可以安全地做什么?