ftell返回不正确的值

我有一个问题,其中ftell返回一个不正确的值。 我的代码,当在linux上的netbeans中运行时报告正确,但完全相同的代码,在Windows上运行netbeans(使用mingw)报告错误。 文件指针是在BINARY_READ中打开的文件。 在我的linux netbeans中,运行我的子程序之后,ftell报告35.在我的windows netbeans中,在调用相同的子程序之后,ftell是3621.我追踪了我的子程序,以下语句似乎导致问题:

if (((header_size = getc (fp)) == EOF) || (header_size == 0)) 

在我的linux netbeans上,这个语句之后的ftell(fp)导致1.但是在我的windows netbeans上,这个语句之后的ftell(fp)是3585。

可能导致问题的原因是什么?

您需要以二进制模式打开文件:

 fp = fopen(name, "rb"); 

或类似的。 你应该养成这样做的习惯,因为只有二进制模式在标准C中有明确定义的行为。在POSIX系统上,二进制和文本(默认)模式的行为相同,但在Windows上,新行的变换发生在弄乱文件内容和偏移的方式。

请注意,这个问题可能与二进制文件没有任何关系,这可能是因为即使64位Windows机器有4个字节的长,而在Linux 64位系统上,长可以是4字节或8字节。

由于ftell返回的时间很长,因此在Windows下,您可以读取的最大文件数为2GB。 而在Linux下,它更高。

Windows下的技巧是使用_ftelli64()而不是ftell(),然后你将有64位访问权限。