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位访问权限。