1

如果我们查看 istream 和 ostream 的文档,我们有以下功能:

istream& seekg ( streampos pos );
istream& seekg ( streamoff off, ios_base::seekdir dir );

ostream& seekp ( streampos pos );
ostream& seekp ( streamoff off, ios_base::seekdir dir );

我想知道为什么每次都有两种形式的功能,而不仅仅是:

istream& seekg ( streamoff off, ios_base::seekdir dir = ios_base::beg );
ostream& seekp ( streamoff off, ios_base::seekdir dir = ios_base::beg );

拥有这两个功能而不是标准的四个功能有什么区别?

4

2 回答 2

3

streampos是一个 typedef ,std::fpos<std::char_traits<char>::state_type>它保存流中的当前位置以及当前的移位状态。多字节编码方案(例如 shift-jis)具有与状态相关的编码。这基本上意味着,根据前面的字符序列,您解释流中某个字节的方式可能会有所不同。streampos您不仅可以在流中保持一个位置,而且还可以存储流中该点的移位状态。此外,由于换行符等在不同系统上的解释不同,因此文本文件中的逻辑位置可能与其实际物理位置不同。streampos这些是不能是简单整数类型的一些原因。

于 2012-10-05T05:50:48.337 回答
0

iostreams 库相当复杂和复杂。类型streamposstreamoff实现定义的,并且不需要实现以使它们以您似乎建议的方式相关的整数。

例如,一个实现提供更大、更强大的代理对象是可行的,它们分别代表位置和偏移的概念,在这种情况下,用户可能希望能够直接使用这样的对象进行搜索,而不是通过转换一个手动进入另一个。

于 2012-10-05T02:28:40.443 回答