std::fpos

< cpp‎ | io
定义于头文件 <ios>
template< class State >
class fpos;

类模板 std::fpos 的特化标识流或文件中的绝对位置。每个 fpos 类型对象保有流中的字节位置(常为 std::streamoff 类型的私有成员)和当前迁移状态, State 类型值(常为 std::mbstate_t )。

提供下列 std::fpos 特化:

 
类型 定义
streampos std::fpos<std::char_traits<char>::state_type>
wstreampos std::fpos<std::char_traits<wchar_t>::state_type>
u8streampos (C++20 起) std::fpos<std::char_traits<char8_t>::state_type>
u16streampos (C++11 起) std::fpos<std::char_traits<char16_t>::state_type>
u32streampos (C++11 起) std::fpos<std::char_traits<char32_t>::state_type>

fpos 的所有特化都符合可默认构造 (DefaultConstructible) 可复制构造 (CopyConstructible) 可复制赋值 (CopyAssignable) 可析构 (Destructible) 可相等比较 (EqualityComparable) 要求。

State 可平凡复制构造,则 fpos 拥有平凡默认构造函数。 若 State 可平凡复制赋值,则 fpos 拥有平凡复制赋值运算符。 若 State 可平凡析构,则 fpos 拥有平凡析构函数。

模板形参

State - 表示迁移状态的类型
类型要求
-
State 必须满足可析构 (Destructible) 可复制赋值 (CopyAssignable) 可复制构造 (CopyConstructible) 可默认构造 (DefaultConstructible) 的要求。

成员函数

获取/设置迁移状态的值
(公开成员函数)

另外,提供支持下列操作的成员和非成员函数:

  • 默认构造函数,存储零偏移并值初始化状态对象。
  • 非 explicit 的构造函数,接受一个(可为 const 的) std::streamoff 类型参数,存储其偏移并值初始化状态对象。此构造函数必须亦接受特殊值 std::streamoff(-1) :某些流操作返回以此方式构造的 std::fpos ,以指示错误。
  • 从(可为 const 的) fposstd::streamoff 的显式转换。结果是存储的偏移。
  • 比较二个(可为 const 的) std::fpos 类型,返回可转换为 bool 的类型的 operator==operator!=p != q 等价于 !(p == q)
  • operator+operator- ,使得对于(可为 const 的) fpos<State> 对象 p 和(可为 const 的) std::streamoff 对象 o
  • p + o 拥有 fpos<State> 类型,而存储的偏移为将 o 加到 p 的结果
  • o + p 拥有可转换为 fpos<State> 的类型,而转换结果等于 p + o
  • p - o 拥有 fpos<State> 类型,而存储的偏移为从 p 的偏移减去 o 的结果
  • operator+=operator-= ,能接受一个(可为 const 的) std::streamoff 并分别对存储的偏移加/减之。
  • operator- ,能对二个(可为 const 的) std::fpos 对象相减,产生 std::streamoff ,使得对于二个这种对象 pqp == q + (p - q)

注意

要求 std::streamposstd::wstreampos 为同一类型,因为要求 std::char_traits<char>::state_typestd::char_traits<wchar_t>::state_type 均为 std::mbstate_t 。 C++98 有过自相矛盾的陈述,说若实现支持窄面向 iostream 中的无迁移编码,则它们可以不同,但在宽面向流中支持一或多个迁移编码,不过这在 C++03 中更正了。

一些 I/O 流成员函数返回并操纵成员 typedef pos_type 类型对象。对于流,这些成员 typedef 由模板形参 Traits 提供,默认为 std::char_traits ,它定义其 pos_typestd::fpos 的特化。 Traits::pos_type 不是 std::fpos<std::mbstate_t>std::streamposstd::wstreampos 的别名)时, I/O 流库的行为是实现定义的。

缺陷报告

下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。

DR 应用于 出版时的行为 正确行为
P0759R1 C++98 规定不清晰且不完整 已整理
P1148R0 C++11 不明确哪个头文件定义 u16streamposu32streampos 或其定义是什么 使之明确

参阅

表示相对的文件/流位置(距 fpos 的偏移),足以表示任何文件大小
(typedef)
返回输出位置指示器
(std::basic_ostream<CharT,Traits> 的公开成员函数)
设置输出位置指示器
(std::basic_ostream<CharT,Traits> 的公开成员函数)
获取文件位置指示器
(函数)