seekg 和 seekp :seek(streampos pos) 和 seek(streamoff off, ios

seekg and seekp : difference between seek(streampos pos) and seek(streamoff off, ios::beg)

本文关键字:seek streamoff off ios streampos seekp seekg pos      更新时间:2023-10-16

如果我们查看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 );

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

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

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

例如,实现提供更大、更强大的代理对象,分别表示位置和偏移量的概念,在这种情况下,用户可能希望能够直接使用此类对象进行查找,而不是手动将一个对象转换为另一个对象。