2014-01-17 81 views
1

我想使用fscanf解析二進制文件(圖像)。如何使用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. 

所以標題是「後跟空格(0x20)P'some字符,隨後依次爲寬度是0xA(換行)和其次是高度」

在我的代碼,我有

t=fscanf(fin,"P%c\r%d %d",&fc,&w, &h); 
    or 
    t=fscanf(fin,"P%c\n%d %d",&fc,&w, &h); 

但並不總會返回(而不是3)1,我的W和H不被讀取。

你能告訴我如何解決我的問題?

+0

對於0x0a,'\ r'很可能是錯誤的 - 使用文字常量代替。 –

+8

使用'fscanf()'來解析文本文件已經夠糟糕了。我認爲瘋狂在於你要走下的道路。 –

+0

謝謝。什麼把fscanf()中的0xa放在我的文件中? – michael

回答

2

您需要跳過文本「#創建者... \ n」。因此,嘗試:

t=fscanf(fin,"P%c\n%*[^\n] %d %d", &fc, &w, &h); 
+0

非常感謝!作品。 – michael

2

你可以通過簡單地讀取跳投前26個字符,然後保存在整型變量

寬度和高度
char fc[26]; 
val=fscanf(fp,"%26c %d %d",fc,&w,&h); 

「26」實現,這是其指定的最大數量的寬度在當前操作中要讀取的字符。因此,這將讀取前26個字符,無論它們是什麼,並且在讀取寬度和高度時都省去很多麻煩,而這實際上就是您想要的。

小心使用「fc」作爲字符串。末尾不添加「NULL」字符。 「fc」只是一個字符數組,並不是NULL終止。