2

我遇到了 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。

什么可能导致问题?

4

2 回答 2

8

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

fp = fopen(name, "rb");

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

于 2013-10-08T23:31:50.800 回答
1

请注意,此问题可能与二进制文件无关,这可能是由于即使 64 位 Windows 机器也有 4 个字节的长,而在 linux 64 位系统上,长可以是 4 字节或 8 字节。

由于 ftell 返回 long,因此在 windows 下您可以读取的最大文件为 2GB。而在linux下,它更高。

windows下的诀窍是使用_ftelli64()而不是ftell(),那么你将有64位访问。

于 2017-11-30T13:24:04.080 回答