我已经将问题简化为下面的基本function,它应该简单地打印文件中的字节数。
当我为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); }
在Windows中,您应该能够“ GetFileSizeEx()
”,并使用GetFileSizeEx()
。
我还建议你阅读生成的代码,看看是否有一些64位的混乱,阻止你的基于stdio的代码的工作。
对不起,不早发布,但我一直在其他项目一直专注于。 以下解决方案工作:
__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的答案副本)。