ftell返回错误值

3

我遇到了一个问题,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。
可能是什么问题导致的呢?

你使用“b”模式打开文件了吗? - Kerrek SB
哦,糟糕了...我对READ_BINARY和WRITE_BINARY的定义有误。它们分别应该是"rb"和"wb",而不是"r"和"w"。谢谢。 - Walter Zydhek
2个回答

9

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

fp = fopen(name, "rb");

或者类似的操作。您应该养成这样的习惯,因为只有二进制模式在标准C中具有明确定义的行为。在POSIX系统上,二进制和文本(默认)模式的行为相同,但在Windows上,换行符会以一种破坏文件内容和偏移量的方式进行操纵。


1
请注意,这个问题可能与二进制文件无关,这可能是因为即使是64位的Windows机器,long仍然是4个字节,而在Linux 64位系统上,long可以是4个字节或8个字节。
由于ftell返回long,在Windows下,您可以读取的最大文件大小为2GB。而在Linux下,它更高。
在Windows下的技巧是使用_ftelli64()而不是ftell(),然后您将拥有64位访问权限。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接