在窗口_fseeki64不寻求SEEK_END正确的大文件

我已经将问题简化为下面的基本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的答案副本)。