C - 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 返回 long,因此在 windows 下,您可以读取的最大文件为 2GB。而在 Linux 下,它更高。

Windows下的诀窍是使用_ftelli64((而不是ftell((,那么你将拥有64位访问权限。

相关内容

  • 没有找到相关文章

最新更新