Windows下feof()的时髦行为

时间:2019-04-25 20:23:01

标签: c windows

因此,我一直在编写一个程序,该程序可以扫描在Linux上使用gcc和clang编译时可以正常工作的文件。但是在Windows上,同时使用Microsoft编译器和MinGW,feof()会触发错误。一旦检测到文件类型的end语句,循环就应该中断,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;
            }
    }

编辑:

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

1 个答案:

答案 0 :(得分:1)

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

此外,您打开的文件大于等于4GB(\n无法处理那么大的文件),或者文件中包含0x1A字节。

请注意,在Windows上使用msvcrt.dll时,默认链接为msvcrt.dll,它等效于Visual Studio 6运行时。您可能不想链接到它。这确实是越野车。 las this question for how to not do so无法回答。