如何使用fscanf解析二进制文件

如何使用fscanf解析二进制文件,c,file-io,C,File Io,我正在尝试使用fscanf解析二进制文件(图像) 这是文件的开头。我想得到文件的“宽度”和“高度”。在这种情况下,宽度为640,高度为480 00000000: 5036 0a23 2043 7265 6174 6564 2062 7920 P6.# Created by 00000010: 4972 6661 6e56 6965 770a 3634 3020 3438 IrfanView.640 48 00000020: 300a 3235 350a a079 35a0 7833 a17

我正在尝试使用fscanf解析二进制文件(图像)

这是文件的开头。我想得到文件的“宽度”和“高度”。在这种情况下,宽度为640,高度为480

00000000: 5036 0a23 2043 7265 6174 6564 2062 7920  P6.# Created by 
00000010: 4972 6661 6e56 6965 770a 3634 3020 3438  IrfanView.640 48
00000020: 300a 3235 350a a079 35a0 7833 a179 349f  0.255..y5.x3.y4.
因此,标题是“p”,一些字符后跟0xa(换行符),后跟宽度,后跟空格(0x20),后跟高度”

在我的代码中,我有

  t=fscanf(fin,"P%c\r%d %d",&fc,&w, &h);
  or 
  t=fscanf(fin,"P%c\n%d %d",&fc,&w, &h);
但是t总是返回1(而不是3),并且我的w和h不被读取

您能告诉我如何解决我的问题吗?

您需要跳过文本“#创建人…\n”。因此,请尝试:

您需要跳过文本“#由…\n创建”。因此,请尝试:


您只需读取前26个字符,然后将宽度和高度保存在整数变量中,即可实现此目的

char fc[26];
val=fscanf(fp,"%26c %d %d",fc,&w,&h );
“26”是指定当前操作中要读取的最大字符数的宽度。因此,这将读出前26个字符,不管它们是什么,并为您节省阅读宽度和高度的许多麻烦,这实际上是您想要的


使用“fc”作为字符串时要小心。末尾不添加“NULL”字符。“fc”只是一个字符数组,不以NULL结尾。

只需读取前26个字符,然后将宽度和高度保存在整数变量中,即可实现此目的

char fc[26];
val=fscanf(fp,"%26c %d %d",fc,&w,&h );
“26”是指定当前操作中要读取的最大字符数的宽度。因此,这将读出前26个字符,不管它们是什么,并为您节省阅读宽度和高度的许多麻烦,这实际上是您想要的


使用“fc”作为字符串时要小心。末尾不添加“NULL”字符。“fc”只是一个字符数组,不以NULL结尾。

\r
对于0x0a很可能是错误的-请改用文字常量。使用
fscanf()
解析文本文件已经够糟糕的了。我认为疯狂就在你要走的路上。谢谢。对于我的文件中的0xa,在fscanf()中\r放置什么?为什么不使用?@PaulR:请注意,
\n
\r
都是空白,因此它们的行为相同,也就是说,其中任何一个都将匹配一段空白(包括0x0a,即
\n
).
\r
对于0x0a很可能是错误的-请改用文字常量。使用
fscanf()
解析文本文件已经够糟糕的了。我认为疯狂就在你要走的路上。谢谢。对于我的文件中的0xa,在fscanf()中\r放置什么?为什么不使用?@PaulR:请注意,
\n
\r
都是空白,因此它们的行为相同,也就是说,任何一个都将匹配一段空白(包括0x0a,即
\n
)。