seekg 和 seekp :seek(streampos pos) 和 seek(streamoff off, ios
seekg and seekp : difference between seek(streampos pos) and seek(streamoff off, ios::beg)
如果我们查看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 );
拥有这两个功能而不是标准的四个功能有什么区别?
streampos
是 std::fpos<std::char_traits<char>::state_type>
的 typedef,它保存流中的当前位置以及当前移位状态。多字节编码方案(如 shift-jis)具有与状态相关的编码。这基本上意味着,根据前面的字符序列,您解释流中某个字节的方式可能会有所不同。使用 streampos
您不仅可以在流中保持一个位置,还可以存储流中该点的移位状态。此外,由于换行符等在不同系统上的解释不同,因此文本文件中的逻辑位置可能与其实际物理位置不同。这些是streampos
不能是简单整数类型的一些原因。
iostreams库相当复杂且涉及。streampos
和 streamoff
的类型是实现定义的,不需要实现来使它们成为以您似乎建议的方式相关的整数。
例如,实现提供更大、更强大的代理对象,分别表示位置和偏移量的概念,在这种情况下,用户可能希望能够直接使用此类对象进行查找,而不是手动将一个对象转换为另一个对象。
相关文章:
- 标准::复制失败,"cannot seek vector iterator after end"
- std::streampos、std::streamoff和std::streamsize是否为long-long-in
- seekg 和 seekp :seek(streampos pos) 和 seek(streamoff off, ios
- Streamsize,Streamoff和其他与流相关的数据类型的实际类型是什么
- 声明大小为 std::streamoff 的数组
- Seek 不适用于使用 boost filtering_istreambuf初始化的 std::istream
- 要使用std::streamoff和std::streamsize,需要包含哪个头文件
- 为什么 C++ fseek/fread 的性能比 C# FileStream 的 Seek/Read 高几倍