有std::streampos
保证unsigned long long
吗?
如果不是这样,如何std::istream::seekg
在大于 4G 的文件上正常工作?
有std::streampos
保证unsigned long long
吗?
如果不是这样,如何std::istream::seekg
在大于 4G 的文件上正常工作?
来自http://en.cppreference.com/w/cpp/io/fpos:
std::streampos
是类模板的特化
template< class State > class fpos;
std::streampos
被类型定义为std::fpos<std::char_traits<char>::state_type>
每个 type 对象都fpos
保存流中的字节位置(通常作为 type 的私有成员std::streamoff
)。
来自http://en.cppreference.com/w/cpp/io/streamoff:
该类型std::streamoff
是一个有符号整数类型,其大小足以表示操作系统支持的最大可能文件大小。通常,这是一个 typedef 到long long
.
为了回答你的问题...
问题std::streampos
保证是unsigned long long
?
回答我确定您的意思是确定是否保证持有该位置的基础整数类型是unsigned long long
。从这个意义上说,真正的问题是是否std::streamoff
保证是unsigned long long
。正如您可以从上面的描述中推断的那样,该问题的答案是“否”。
问题如果不是这样,如何std::istream::seekg
在大于 4G 的文件上正常工作?
回答如果操作系统支持处理大于 4G 的文件,则std::streamoff
相应地进行类型定义。即使那样,它也很可能是有符号整数类型。这是来自http://en.cppreference.com/w/cpp/io/streamoff的另一句话。
一些 I/O 库函数也使用 std::streamoff 值 -1 来表示错误条件。
不,不能保证是unsigned long long
.
特别是对于较旧的编译器,它可能不适用于大于 4 GB 的文件(在少数情况下它已签名,因此它仅适用于高达 2 GB 的文件——但当典型的硬盘驱动器为 20 到 40 兆字节时,可能似乎不是主要考虑因素)。