“std::streampos”保证是“unsigned long long”吗?
如果不是,那么在处理大于4G的文件时,“std::istream::seekg”如何正常工作?
“std::streampos”保证是“unsigned long long”吗?
如果不是,那么在处理大于4G的文件时,“std::istream::seekg”如何正常工作?
来自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
。根据上面的描述,这个问题的答案是“否”。
问题 如果不是这样,std::istream::seekg
如何在大于4G的文件上正确工作?
答案 如果操作系统支持处理大于4G的文件,则其std::streamoff
将相应地进行typedef。即使如此,它也很可能是一个带符号的整数类型。这里还有一句引用自http://en.cppreference.com/w/cpp/io/streamoff的话:
一些I/O库函数使用std::streamoff值-1来表示错误条件。
不,它并不能保证是 unsigned long long
。
特别是对于老的编译器来说,它可能无法处理大于4GB的文件(在一些情况下它是有符号的,因此只能处理2GB以下的文件 - 但当典型硬盘仅为20至40 MB时,这似乎并不像一个主要考虑因素)。
std::streampos
? - xmllmx
streamoff
绝对是有符号的。你能解释一下为什么从那里开始,要将streampos
也设为有符号吗? - Ben Voigt