2015-08-25 54 views
0

我有一個二進制文件,我需要從中讀取32位模式 - 如果EOF已達到使其小於32位的事件 - 我需要錯誤地說出乎意料的其他只是打破。我嘗試了很多,但我無法獲取不完整的字節檢測部分的工作。有人可以提供一些指針如何實現它?我曾經想過一次只能探測一個字節byte [0],然後評估它的EOF但是沒有工作。檢測不完整的32位二進制數據

for (;;) 
    { 
    bytes_read = fread(buffer, 4, 1, inFile); 
    if (bytes_read == 1) 
    { 
     // perform the task 
    } 
    else 
    { 
     // detect if its incomplete sequence or EOF and output appropriately 
    } 
    } 

P.S:編輯FREAD按照評論 -

+0

爲什麼你使用'sizeof(char)'作爲要讀取的項目數? – Barmar

+0

'sizeof(char)'總是1. EOF標記不適合'char'。你正在嘗試閱讀多個字符,並仍然比較你是否只閱讀一個字符? –

+0

文件中沒有「十六進制」;你有**二進制**。十六進制由**文本**組成,如'3D0F',它是**四個**字符,表示16位或兩個字節。還要注意'sizeof(char)'的定義是'1',並且由於其他原因使用它是不恰當的:'fread'的第三個參數表示要讀取的元素的數量,第二個參數給出的大小。 'sizeof(char)'不是表達「給我一個元素」概念的好方法。 – Kaz

回答

1

您的代碼告知fread從文件中讀取一個包含4個字節的記錄。如果記錄不完整,它將返回0(0記錄讀取,錯誤)。如果記錄丟失(在文件末尾),它也將返回0(0記錄讀取,正常情況)。您必須調整您的代碼以區分這些情況,具體做法是讓fread返回4(字節)。

如果這是不可能的,在文件的結尾讀取4個字節,你想fread輸出小於4.有這種行爲,你應該告訴FREAD在1個字節爲單位閱讀:

bytes_read = fread(buffer, 1, 4, inFile); 

然後看數字:

if (bytes_read == 4) 
{ 
    // perform the task 
} 
else if (bytes_read > 0) 
{ 
    // bad file format - not a multiple of 4 bytes 
} 
else if (bytes_read == 0) 
{ 
    break; // success 
} 
else // bytes_read = -1 
{ 
    // general file error 
} 
+0

ahh - 如果我能想到 - 我會將字節數從4,1換成fread-1,4 - 謝謝一噸..解決了我的問題 – oneday

0

fread不返回的字節數讀,它返回的項目數,其大小在第二給出參數,進行讀取。既然你要求它讀1個項目,如果在讀取物品的所有字節之前遇到EOF,則應返回0

儘管sizeof(char)被定義爲1,但在實際上並未指向某個東西的大小的上下文中使用它是不恰當的。在這種情況下,這只是一個計數,所以你應該使用1

size_t items_read = fread(buffer, sizeof(unsigned long), 1, inFile); 
if (items_read == 1) { 
    // perform the task 
} else if (feof(inFile)) { 
    // got EOF before reading the last number 
} else if (ferror(inFile)) { 
    // got an error 
} 
+0

感謝您的解決方案 - 我嘗試了你的建議,但它沒有給出預期的輸出。示例輸入參數64702E63 0D0A ..與0D0A我期望它給錯誤和中斷,並在事件中它是0D0A0000 - 沒有錯誤 – oneday

+0

如果你'讀取十六進制數字,而不是二進制數字,你不應該首先使用'sizeof(unsigned long)'。 'sizeof(unsigned long)'可能是4個字節,但十六進制表示是8個字節。 – Barmar

+0

也許你應該使用'fgets()'和'sscanf()'來讀取一行並解析其中的數字。 – Barmar