2010-04-05 93 views
1

我正在使用fread將文件的內容讀入char數組。但我不確定爲什麼它沒有在輸出中打印。以下是代碼:用二進制文件C指針

void getInfo(FILE* inputFile) 
{ 
    char chunk[4]; 
    int liIndex; 
    for (liIndex = 0 ; liIndex < 4 ; liIndex++) 
    { 
     fread(chunk, sizeof(char), 4, inputFile); 
    } 
    printf("\n chunk %s", chunk); 
} 

輸出完全沒有打印。我哪裏錯了?

問候, darkie

+2

,而不是在FREAD()函數hadcoding 「4」,你可以嘗試:的sizeof(塊)。 – 2010-04-05 20:39:10

回答

2

無法使用printf打印二進制文件。 printf會將二進制blob視爲以空字符結尾的字符串,因此任何發生在您的塊中的字節都將結束「字符串」。

要寫入的塊全部到標準輸出,使用fwrite

fwrite(chunk, sizeof(char), 4, stdout); 
+0

+1使用fwrite()而不是printf()的好處。 – 2010-04-05 20:40:55

+0

嗨, 雖然我很愚蠢的問題。我使用了上面的語句並使用fprintf來打印標準輸出。但仍然沒有顯示。對不起,測試你的耐心..但是,你能告訴我我要去哪裏嗎 – 2010-04-05 20:57:56

+0

當然你可以用printf打印一個二進制文件。問題出在%s格式。但%d或%c可以正常工作,具體取決於darkie15預計二進制數據的樣子。 – janks 2010-04-05 21:03:35

3

移動printf進入循環。就這樣,你只打印最後一個塊讀取。

編輯:我明白地看過這個問題,但不是標題。你必須這樣做切換到fwrite像托馬斯說。

3

在我看來,FREAD和fwrite只是添加混亂層。

嘗試改用面向字節的輸入和輸出函數,因爲4字節的塊沒有比根本不使用塊更好,並且不會在代碼中寫入錯誤。

int ch; 
while ((ch = getc(inputFile)) != EOF) 
    putchar(ch); 

但我認爲真正的問題在於你可能不完全明白你的要求。您正在讀取二進制數據,然後嘗試將其打印爲字符數據;許多任意的字節值不對應任何可打印的字符。你期望看到那些字節是什麼?

更豐富的方法可能是打印出每個字節的整數值以及它所表示的字符。當你的文件中有不可打印的字符時,這會讓你清楚地看到。

例如,

void func(FILE *s) 
{ 
    int ch; 
    while ((ch = getc(s)) != EOF) 
     printf("%d -> %c\n", ch, ch); 
} 

當我運行在包含每個字節的一個文件這個節目片段中,可以清楚地看到,當解釋爲字符多的值沒有任何意義:

[snip...] 
29 -> 
30 -> 
31 -> 
32 -> 
33 -> ! 
34 -> " 
35 -> # 
36 -> $ 
37 -> % 
38 -> & 
39 -> ' 
[...more snipping] 
1

有點解構你的源代碼:

void getInfo(FILE* inputFile) 
{ 
    char chunk[4]; 
    int liIndex; 
    for (liIndex = 0 ; liIndex < 4 ; liIndex++) 
    { 
     fread(chunk, sizeof(char), 4, inputFile); 

你一次讀取4個字節,re重複4次;這意味着當循環退出時,您讀取了16個字節,並且塊包含12-16字節。這是你的意圖嗎?如果您只想讀取前四個字節,請將循環消除,然後撥打fread一次。如果你想讀取並打印前16個字節,那麼你還需要將輸出語句移到循環中。

正如其他人所說,不要硬編碼的4;改爲使用sizeof chunk

} 
    printf("\n chunk %s", chunk); 
} 

記住%s轉換說明預計相應參數指向的可打印字符0終結序列,所以chunk[0]通過chunk[2]需要是可打印的(即,isprint(chunk[i]) == 1),以及組塊[3]具有更好的總是0,或者你可能會得到一些奇怪的輸出。由於二進制文件很少出現這種情況,因此您可能需要更改編寫該輸出的方式。

這裏是你如何可以打印單個字節整數值:

printf("chunk: "); 
for (i = 0; i < sizeof chunk; i++) 
    printf("%02x ", chunk[i]; 
putchar('\n');