8

代码当前执行此操作,并且 fgetpos 确实处理大于 4GB 的文件,但搜索返回错误,所以知道如何搜索到 a 的末尾file > 4GB吗?

fpos_t currentpos;

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

fgetpos(fp,&currentpos);
m_filesize=currentpos;
4

6 回答 6

9

忽略所有出现“64”的答案。在 Linux 上,您应该添加-D_FILE_OFFSET_BITS=64到您的 CFLAGS 并使用fseekoandftello获取/返回off_t值的函数,而不是long. 这些不是 C 的一部分,而是 POSIX 的一部分。其他(非 Linux)POSIX 系统可能需要不同的选项来确保它off_t是 64 位的;检查您的文档。

于 2010-08-03T18:16:54.050 回答
6

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

在 linux stat64 (manpage)上是正确的。fstat 如果您使用的是 FILE*。

于 2008-09-22T03:41:09.510 回答
3

这段代码在 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;
}
于 2008-09-22T02:52:46.257 回答
2

(从 glibc 手册中窃取)

int fgetpos64 (FILE *stream, fpos64_t *position)

此函数类似于 fgetpos,但文件位置fpos64_t以位置指向的类型变量返回。

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

于 2008-09-22T02:42:44.407 回答
2

Stat 总是比 fseek 更好地确定文件大小,它会在不是文件的东西上安全失败。64 位文件大小是特定于操作的东西,在 gcc 上,您可以在命令的末尾加上“64”,或者您可以强制它默认将所有标准调用设为 64。有关详细信息,请参阅您的编译器手册。

于 2008-09-22T02:48:14.863 回答
1

至少在 linux 上,您可以使用 lseek64 代替 fseek。

于 2008-09-22T02:40:33.150 回答