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