目前的代码可以执行此操作,而且fgetpos可以处理大于4GB的文件,但是seek会返回一个错误,那么有什么办法可以寻找到大于4GB的文件结尾呢?
fpos_t currentpos;
sok=fseek(fp,0,SEEK_END);
assert(sok==0,"Seek error!");
fgetpos(fp,¤tpos);
m_filesize=currentpos;
目前的代码可以执行此操作,而且fgetpos可以处理大于4GB的文件,但是seek会返回一个错误,那么有什么办法可以寻找到大于4GB的文件结尾呢?
fpos_t currentpos;
sok=fseek(fp,0,SEEK_END);
assert(sok==0,"Seek error!");
fgetpos(fp,¤tpos);
m_filesize=currentpos;
-D_FILE_OFFSET_BITS=64
添加到您的CFLAGS中,并使用fseeko
和ftello
函数,这些函数采用/返回off_t
值而不是long
。这些函数不属于C语言标准,但属于POSIX标准。其他(非Linux)的POSIX系统可能需要不同的选项来确保off_t
为64位,请查看您的文档。这段代码在Linux系统下可行:
int64_t bigFileSize(const char *path)
{
struct stat64 S;
if(-1 == stat64(path, &S))
{
printf("Error!\r\n");
return -1;
}
return S.st_size;
}
(摘自glibc手册)
int fgetpos64 (FILE *stream, fpos64_t *position)
此函数类似于fgetpos,但文件位置返回到类型为fpos64_t
的变量中,该变量由position指向。
如果源代码在32位机器上使用_FILE_OFFSET_BITS == 64
编译,则此函数可用于名称fgetpos
,并且自动替换旧接口。
使用stat函数来确定文件大小比使用fseek更好,它可以在不是文件的情况下安全地失败。 64位文件大小是操作系统特定的事情,在gcc上,您可以在命令的末尾加上“64”,或者您可以强制使所有标准调用默认为64。有关详细信息,请参阅您的编译器手册。
在Linux上,你可以使用lseek64而不是fseek。