如果我们查看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 );
使用这两个函数而不是标准的四个函数之间会有什么区别?
答案 0 :(得分:3)
streampos
是std::fpos<std::char_traits<char>::state_type>
的typedef,它保存流中的当前位置以及当前的移位状态。诸如shift-jis的多字节编码方案具有依赖于状态的编码。这意味着什么基本上取决于前面的字符序列,你如何解释流中的某个字节可能是不同的。使用streampos
,您不仅可以在流中保持一个位置,还可以存储流中该点的移位状态。此外,由于换行符等在不同系统上的解释方式不同,因此文本文件中的逻辑位置可能与其实际物理位置不同。这些是streampos
不能是简单整数类型的一些原因。
答案 1 :(得分:0)
iostreams库相当复杂并且参与其中。类型streampos
和streamoff
是实现定义的,并且不需要实现来使它们以您似乎建议的方式相关的整数。
例如,实现提供更大,更强大的代理对象是可行的,这些代理对象分别代表位置和偏移的概念,在这种情况下,用户可能希望能够直接寻找这样的对象,而不是通过手动将一个转换为另一个。