我已将问题简化为以下基本功能,该功能应该简单地打印
文件中的字节数。
当我对 83886080 字节 (80 MB) 的文件执行它时,它会打印正确的数字。
然而,对于 4815060992 字节 (4.48 GB) 的文件,它会打印 520093696,这太低了。
这似乎与SEEK_END选项,因为如果我手动将指针设置为 4815060992 字节(例如_fseeki64(fp, (__int64)4815060992, SEEK_SET)
_ftelli64
确实返回正确的位置。
因此,解决方法是在不使用的情况下获得正确的文件大小SEEK_END,这是怎么做到的?
该代码是在 32 位 Windows 系统上编译的(因此__int64
, _iseeki64
and _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的答案副本)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)