ftell返回错误的值

时间:2013-10-08 23:16:50

标签: c netbeans getc 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。

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

2 个答案:

答案 0 :(得分:6)

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

fp = fopen(name, "rb");

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

答案 1 :(得分:0)

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

由于ftell返回long,在windows下,你可以读取的最大文件是2GB。而在Linux下,它更高。

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