9

std::streampos保证unsigned long long吗?

如果不是这样,如何std::istream::seekg在大于 4G 的文件上正常工作?

4

2 回答 2

10

来自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 来表示错误条件。

于 2014-06-26T18:17:08.543 回答
4

不,不能保证是unsigned long long.

特别是对于较旧的编译器,它可能不适用于大于 4 GB 的文件(在少数情况下它已签名,因此它仅适用于高达 2 GB 的文件——但当典型的硬盘驱动器为 20 到 40 兆字节时,可能似乎不是主要考虑因素)。

于 2014-06-26T17:50:48.647 回答