是否保证std::streampos是unsigned long long ?
Is std::streampos guaranteed to be unsigned long long?
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
类型的私有成员)。
:
类型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兆字节时,这可能不是一个主要考虑因素)。
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- <Windows>为什么 std::thread::native_handle 返回类型为"long long unsigned int"的值,而不是 void*(又名 HANDLE)?
- 错误:隐式转换更改符号:'int'到'unsigned long'
- 对 '(const Y) (int&, std::mersenne_twister_engine<long unsigned int,
- 错误:'class std::unique_ptr<std::set<long unsigned int> >'没有名为 'size' 的成员
- "1L << count"是什么意思?如何使用超出"unsigned long long int? "范围的语句编号打印?
- C++11 模板函数"implicity"将位集<N>转换为"unsigned long"
- 没有匹配函数来调用"std::basic_ofstream<char>::write(std::string*, long long unsigned int)"
- 从C 服务器传输unsigned Long到C#客户端
- 对 'WindowProc(HWND__*, unsigned int, unsigned int, long)@16' 的未定义引用
- 如何处理计算中的"unsigned long long int"?
- 对"cv::String::allocate(unsigned long)"的未定义引用
- unsigned int/signed int/long-long:无法解释的输出
- 对"uint32_t"的暧昧呼唤"long unsigned int"
- 错误:从'int (*)()'到'long unsigned int'的转换无效
- 错误:无法将'long unsigned int (A::*)()'转换为'poFunc {aka long unsigned int (*)()}'
- G++ 编译器:从 'pthread_t {aka long unsigned int}' 到 'void* (*)(void*)' 的转换无效 [-允许]
- " long unsigned typedef int long ullong; "是什么意思?
- 为什么64位GCC在分配数组时会警告将const int转换为long unsigned int
- C++:错误:数组下标的类型“size_t{aka long unsigned int}[size_t{aka long