代码当前执行此操作,并且 fgetpos 确实处理大于 4GB 的文件,但搜索返回错误,所以知道如何搜索到 a 的末尾file > 4GB
吗?
fpos_t currentpos;
sok=fseek(fp,0,SEEK_END);
assert(sok==0,"Seek error!");
fgetpos(fp,¤tpos);
m_filesize=currentpos;
忽略所有出现“64”的答案。在 Linux 上,您应该添加-D_FILE_OFFSET_BITS=64
到您的 CFLAGS 并使用fseeko
andftello
获取/返回off_t
值的函数,而不是long
. 这些不是 C 的一部分,而是 POSIX 的一部分。其他(非 Linux)POSIX 系统可能需要不同的选项来确保它off_t
是 64 位的;检查您的文档。
如果您使用的是 Windows,则需要GetFileSizeEx (MSDN)。返回值是一个 64 位的 int。
在 linux stat64 (manpage)上是正确的。fstat 如果您使用的是 FILE*。
这段代码在 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
以位置指向的类型变量返回。
如果源代码是_FILE_OFFSET_BITS == 64
在 32 位机器上编译的,则此功能在名称下可用fgetpos
,因此可以透明地替换旧接口。
Stat 总是比 fseek 更好地确定文件大小,它会在不是文件的东西上安全失败。64 位文件大小是特定于操作的东西,在 gcc 上,您可以在命令的末尾加上“64”,或者您可以强制它默认将所有标准调用设为 64。有关详细信息,请参阅您的编译器手册。
至少在 linux 上,您可以使用 lseek64 代替 fseek。