将字节1b扫描为字符后,feof()和fscanf()停止工作。是因为它是';ESC&x27;用ascii码?我能做什么?

将字节1b扫描为字符后,feof()和fscanf()停止工作。是因为它是';ESC&x27;用ascii码?我能做什么?,c,loops,escaping,scanf,feof,C,Loops,Escaping,Scanf,Feof,我目前正在编写一个处理PPM文件的程序(P6类型,而不是P3) 问题在于,某些图像具有字节0x1b,根据ascii表,该字节被称为“ESC” 下面是我的代码: //所有这些都包括在那里 出于某种原因,fscanf在读取'ESC'字节后开始返回-1(但读取它的字节不返回-1) 因此,示例输出将是: 一, -1 -一, 另一方面,我读到了“while(!feof())总是错的”和关于fscanf的大文件,但是我的ppm图像不超过500x500像素 为了能够继续阅读,我可以/应该做什么 谢谢你的帮助

我目前正在编写一个处理PPM文件的程序(P6类型,而不是P3) 问题在于,某些图像具有字节0x1b,根据ascii表,该字节被称为“ESC”

下面是我的代码:

//所有这些都包括在那里

出于某种原因,fscanf在读取'ESC'字节后开始返回-1(但读取它的字节不返回-1)

因此,示例输出将是:

一, -1 -一,


另一方面,我读到了“while(!feof())总是错的”和关于fscanf的大文件,但是我的ppm图像不超过500x500像素

为了能够继续阅读,我可以/应该做什么


谢谢你的帮助

我猜你在Windows上;值为
0x1b
的字节表示Windows上文本文件的“文件结束”。(参见注释;此解释是错误的,但解决方案有效,可能是因为数据中存在
0x1a

您应该以二进制模式打开文件:

fopen("my.ppm", "rb");

这将成功读取所有字节。(也将同时读取<代码> > r>代码>和“结束标记”的<代码> \n>代码>)可以考虑使用<代码>“RB”< /> >而不是<代码>“R”<代码> >代码> fOpen< /COD>(在处理二进制文件时,它在Windows下有所不同)如果您只阅读一个字符,请考虑使用<代码> FGECC <代码>。0x1a(^ z)是窗口上的EOF,而不是0x1B@user3596853你为什么接受我的回答?对你有用吗?似乎不应该…非常感谢你,非常善良的陌生人。用二进制读取它确实会有所不同。顺便问一下,二进制读取和正常读取之间还有什么区别吗?比如,我是否需要以不同的方式使用我的FSCANF?或者一起使用其他东西?idk,如果是因为那个特定的字节,但使用“rb”确实解决了我的问题。这就是我接受它的原因。虽然很有趣的是,你会发布一个解决方案,知道/期望它失败,即使解释不正确,这个解决方案也可能有帮助,但我不知道怎么做。或者OP实际上有1A而不是1B?可能
0x1b
后面的字节是
0x1a
(Windows上的文本模式
EOF
)。该问题指出,
fscanf()
调用“读取[0x1b字符]不会返回-1”-随后的
fscanf()
调用会返回。
fopen("my.ppm", "rb");