【问题标题】:Funky behaviour of feof() under WindowsWindows 下 feof() 的古怪行为
【发布时间】:2019-04-25 20:23:00
【问题描述】:

所以我一直在编写一个程序,它可以扫描在 Linux 上使用 gcc 和 clang 编译时运行良好的文件。但在 Windows 上,使用 Microsoft 编译器和 MinGW,feof() 会错误触发。一旦检测到文件类型的结束语句,循环就会中断,feof 仅作为故障保护存在,并且永远不会触发 Linux 上的正确文件……

我让程序用 ftell() 打印文件指针位置,而这些值完全是错误的。 EOF 总是在比实际文件大小低几个数量级的 2^n 值处触发...

while(1)
    {
            ...
            //File is read here
            //normally breaks before EOF-check

            if(feof(in))
            {
                    DEBUG_PRINTF("Reached EOF before IEND\n");
                    break;
            }
    }

编辑:

用“rb”代替“r”打开文件解决了问题

【问题讨论】:

  • 您是否像打开文本文件一样打开二进制文件? Linux 没有实际区别,但 Windows 有。
  • 二进制模式解决了它。谢谢!

标签: c windows


【解决方案1】:

您使用fopen(..., "r") 打开了您的文件。这是一个文本文件。 ftell() 将返回正确的值以传回fseek(),这些值与您读取的字节数的值不同,因为库正在为您处理\r\n -> \n

此外,您要么打开了 >= 4GB 的文件(msvcrt.dll 无法处理那么大的文件),要么文件中有 0x1A 字节。

请注意,在 Windows 上使用 gcc 时,默认链接到 msvcrt.dll,它相当于 Visual Studio 6 运行时。您可能不想链接它。真的很坑。唉this question for how to not do so 无人接听。

【讨论】:

    猜你喜欢
    • 2011-10-28
    • 2011-05-01
    • 2013-06-07
    • 1970-01-01
    • 2013-04-22
    • 1970-01-01
    • 2018-05-25
    • 2019-09-09
    • 1970-01-01
    相关资源
    最近更新 更多