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

Is std::streampos guaranteed to be unsigned long long?

本文关键字:long unsigned streampos std 是否      更新时间:2023-10-16

std::streampos一定是unsigned long long吗?

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

From 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>

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

从http://en.cppreference.com/w/cpp/io/streamoff

:

类型std::streamoff是一个有符号整型,它的大小足以表示操作系统支持的最大文件大小。通常,这是对long long的类型定义。

回答你的问题…

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

Answer我相信你想知道持有该位置的底层整数类型是否保证为unsigned long long。从这个意义上说,真正的问题是std::streamoff是否保证是unsigned long long。从上面的描述可以推断,这个问题的答案是"否"。

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

Answer如果操作系统支持处理大于4G的文件,则相应地定义std::streamoff。即使这样,它也很可能是有符号整型。下面是来自http://en.cppreference.com/w/cpp/io/streamoff的另一段话。

std::streamoff值-1也被一些I/O库函数用来表示错误条件。

不,不能保证是unsigned long long

特别是在较旧的编译器中,它可能不能处理大于4 GB的文件(在少数情况下它是签名的,所以它只能处理最大2 GB的文件——但是当典型的硬盘驱动器是20到40兆字节时,这可能不是一个主要考虑因素)。

相关文章: