gpt4 book ai didi

c - 在 Windows 上,_fseeki64 不会为大文件正确寻求 SEEK_END

转载 作者:可可西里 更新时间:2023-11-01 10:29:32 26 4
gpt4 key购买 nike

我已将问题简化为以下基本函数,它应该简单地打印文件中的字节数。

当我对一个 83886080 字节 (80 MB) 的文件执行它时,它会打印出正确的数字。但是,对于 4815060992 字节 (4.48 GB) 的文件,它会打印 520093696,这太低了。

这似乎与 SEEK_END 选项有关,因为如果我手动将指针设置为 4815060992 字节(例如 _fseeki64(fp, (__int64)4815060992, SEEK_SET) _ftelli64 确实返回了正确的位置。因此,解决方法是在不使用 SEEK_END 的情况下获取正确的文件大小,这是如何完成的?

代码是在 32 位 Windows 系统(因此 __int64_iseeki64_ftelli64)上使用 MinGW 编译的。

简而言之:我在这里做错了什么?

void printbytes(char* filename)
{
FILE *fp;
__int64 n;
int result;

/* Open file */
fp = fopen(filename, "rb");
if (fp == NULL)
{
perror("Error: could not open file!\n");
return -1;
}

/* Find end of file */
result = _fseeki64(fp, (__int64)0, SEEK_END);
if (result)
{
perror("Error: fseek failed!\n");
return result;
}

/* Get number of bytes */
n = _ftelli64(fp);

printf("%I64d\n", n);

/* Close file */
fclose(fp);
}

最佳答案

很抱歉没有早点发布,但我已经有一段时间全神贯注于其他项目了。以下解决方案有效:

__int64 nsamples(char* filename)
{
int fh;
__int64 n;

/* Open file */
fh = _open( filename, _O_BINARY );

/* Find end of file */
n = _lseeki64(fh, 0, SEEK_END);

/* Close file */
_close(fh);

return n / sizeof(short);
}

诀窍是使用 _open 而不是 fopen 打开文件。我仍然不明白为什么必须这样做,但至少现在可以了。感谢大家的建议,这些建议最终为我指明了正确的方向。(这是对相关问题编号 4003405 的答案的副本)。

关于c - 在 Windows 上,_fseeki64 不会为大文件正确寻求 SEEK_END,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4034227/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com