我已将问题简化为以下基本功能,该功能应仅打印文件中的字节数。
当我为 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);
}