std :: streampos保证长签名是无符号的吗?

时间:2014-06-26 17:47:17

标签: c++ file types integer unsigned-long-long-int

std::streampos保证是unsigned long long吗?

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

2 个答案:

答案 0 :(得分:8)

来自http://en.cppreference.com/w/cpp/io/fpos

std::streampos是类模板

的特化
template< class State > class fpos;

std::streampos的typedef为std::fpos<std::char_traits<char>::state_type>

类型fpos的每个对象都保存流中的字节位置(通常作为类型std::streamoff的私有成员)。

来自http://en.cppreference.com/w/cpp/io/streamoff

类型std::streamoff是一个足够大小的有符号整数类型,表示操作系统支持的最大可能文件大小。通常,这是long long的typedef。

回答你的问题......

问题 std::streampos保证是unsigned long long吗?

回答我确定您的意思是要确定持有该职位的基础整数类型是否保证为unsigned long long。从这个意义上讲,真正的问题是std::streamoff是否被认为是unsigned long long。这个问题的答案是&#34; No&#34;,你可以从上面的描述中推断出来。

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

回答如果操作系统支持使用大于4G的文件,那么它的std::streamoff就是相应的类型。即便如此,它很可能是一个有符号整数类型。这是http://en.cppreference.com/w/cpp/io/streamoff的另一个引用。

  

std :: streamoff值-1也用于表示某些I / O库函数的错误条件。

答案 1 :(得分:4)

不,不能保证是unsigned long long

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