C Windows下feof()的古怪行为

C Windows下feof()的古怪行为,c,windows,C,Windows,因此,我一直在编写一个程序,它可以扫描在Linux上使用gcc和clang编译时工作正常的文件。但在Windows上,同时使用Microsoft编译器和MinGW,feof()错误触发器。一旦检测到文件类型的end语句,循环就会中断,feof仅作为故障保护存在,并且不会触发Linux上的正确文件 我让程序用ftell()打印文件指针位置,结果值完全错了。EOF总是在比实际文件大小低一些数量级的2^n值处触发 while(1) { ... /

因此,我一直在编写一个程序,它可以扫描在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”打开文件解决了问题

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

此外,您可能打开了一个大于等于4GB的文件(
msvcrt.dll
无法处理那么大的文件),或者文件中有一个0x1A字节


请注意,在Windows上使用
gcc
时,针对
msvcrt.dll
的链接是默认设置,与Visual Studio 6运行时相当。你可能不想链接到它。它真的有马车。唉,没有回答。

给我们看一个。你是否打开了一个二进制文件,就好像它是一个文本文件一样?Linux没有做出实际的区分,但Windows做到了。二进制模式解决了这个问题。谢谢