C:什么';以字节为单位的文件大小使用的数据类型是否正确?
如果我使用类似于C:什么';以字节为单位的文件大小使用的数据类型是否正确?,c,types,C,Types,如果我使用类似于double的方法来保存以字节为单位的文件大小,那么很快就会失败,那么我会使用哪种数据类型呢?现在有两个TB是常见的,所以我希望数据类型能够容纳这么大的数字。long是流行的最爱:)大小\u t是C中文件大小的常见值,但它的类型取决于平台(Windows上的32位或64位无符号int)。我建议uu int64(一个64位的int)应该能够处理高达138547332terrabytes的数据 编辑:只要检查一下,Windows API调用GetFileSizeEx就会得到一个大整数
double
的方法来保存以字节为单位的文件大小,那么很快就会失败,那么我会使用哪种数据类型呢?现在有两个TB是常见的,所以我希望数据类型能够容纳这么大的数字。long
是流行的最爱:)大小\u t是C中文件大小的常见值,但它的类型取决于平台(Windows上的32位或64位无符号int)。我建议uu int64(一个64位的int)应该能够处理高达138547332terrabytes的数据
编辑:只要检查一下,Windows API调用
GetFileSizeEx
就会得到一个大整数,它是一个64位有符号整数。这么大的整数也不错。有一个名为ftello()
的函数,它返回一个off\t
使用fgetpos()
,您需要一个fpos\u t
变量-EDIT:它不一定是算术类型
因此,
off\u t
可以/应该适合您的需要,并使您独立于实际的数据类型大小。您可能需要考虑使用off\u t
,因为这是诸如和之类的标准函数所使用的。这取决于您的平台。在Unix系统上,您可能可以使用off\t
类型。在Windows上,您可能需要使用LARGE\u INTEGER
。这些是返回文件大小的函数在这些系统上使用的类型(Unix上为stat
,Windows上为GetFileSize
)
如果您想要便携式类型,
uint64\u t
应该足够大。libcstat
使用off\u t
,这是一种用于无符号、64位宽类型的typedef。这将适合一段时间。根据记录,size\u t
在64位构建中的大小为64位。它不是unsigned int
,它是一种无符号整数类型。抱歉,@paxdiablo,正如您所暗示的,它实际上依赖于平台。在使用32位的Windows上,它相当于一个未签名的int。上次我相信Visual Studio告诉我的。:)我对我的答案进行了更精确的编辑。这里的更多信息:size\t
在许多系统上不是正确的抽象,它是用来处理对象的大小的。在典型的32位系统上,这是一个32位的值,而您的文件可能比4GiB大得多。正确-“size\t”用于处理对象的大小,“off\t”用于处理文件的偏移量。在大多数现代I/O库中,“off\u t”转换为“long long”(64位无符号整数)。在快速的Google会话之后,看起来uint64\u t就是我想要的。谢谢回复的数量和回复的时间让我不知所措。太棒了@EnibMoc1994:您也可以使用long
或其未签名的伙伴,保证至少为64位。请注意ftello
和off\u t
是Posix,而不是标准C。如果您没有off\u t
您也没有ftello
,并且没有(便携的)获取大于long
…+1的文件偏移量的方法,因为它费心询问,而不仅仅是使用伪造的东西。:-)欢迎来到SO!off_t是OSX上签名长的typedef。