代码当前执行此操作并且fgetpos会处理大于4GB的文件,但搜索会返回错误,因此任何想法如何寻找文件的结尾> 4GB

fpos_t currentpos;

sok=fseek(fp,0,SEEK_END);
assert(sok==0,"Seek error!");

fgetpos(fp,&currentpos);
m_filesize=currentpos;
有帮助吗?

解决方案

如果您使用的是Windows,则需要 GetFileSizeEx( MSDN)。返回值是64位int。

在Linux上 stat64(联机页面)是正确的。 fstat如果你正在处理文件*。

其他提示

使用“64”忽略所有答案。出现在他们身上。在Linux上,您应该将 -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 类型的变量中返回到位置点。

如果在32位机器上使用 _FILE_OFFSET_BITS == 64 编译源代码,则此功能在名称 fgetpos 下可用,因此透明地替换旧接口。

Stat总是优于fseek来确定文件大小,它会在非文件的情况下安全地失败。 64位文件大小是特定于操作的东西,在gcc上你可以放“64”。在命令的末尾,或者你可以强制它默认进行所有标准调用64。有关详细信息,请参阅编译器手册。

至少在linux上,你可以使用lseek64而不是fseek。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top