std::streampos是否保证为unsigned long long类型?

11

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

如果不是,那么在处理大于4G的文件时,“std::istream::seekg”如何正常工作?

2个回答

11

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


streamoff 绝对是有符号的。你能解释一下为什么从那里开始,要将 streampos 也设为有符号吗? - Ben Voigt
@BenVoigt,那是个打错字。感谢你注意到并告诉我 :) - R Sahu

4

不,它并不能保证是 unsigned long long

特别是对于老的编译器来说,它可能无法处理大于4GB的文件(在一些情况下它是有符号的,因此只能处理2GB以下的文件 - 但当典型硬盘仅为20至40 MB时,这似乎并不像一个主要考虑因素)。


在什么情况下应该使用有符号的 std::streampos - xmllmx
我认为只能在预标准iostreams中进行签名。 - Ben Voigt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接