2011-10-10 77 views
1

我想讀一個二進制文件爲它的內容 它有兩套爲每個組件在第一行 倒數第二個字符的行指示組件文件的類型(^A二進制文件裝配和部分^B) 如果類型爲^A我需要解析與名始於下一行指定的文件^ @解析用C

àtype^@^Aà 
name^@assembly1 

àtype^@^Aà 
name^@assembly2 

àtype^@^Bà 
name^@apart1 

àtype^@^Bà 
name^@apart2 

當我嘗試解析此文件,我無法讀取文件中的二進制字符。 第一行包含一個二進制字符(),所以我得到一個空行。第二行有^@名之後,所以我只得到「名」和len爲4 這是我的代碼片段

FILE *fp; 
    char line[256]; 
    fp = fopen(name, "rb"); 
    fgets(line, 256, fp); 

    printf("line %s\n", line); 
    printf("len %d\n\n", strlen(line)); 

    fgets(line, 256, fp); 

    printf("line %s\n", line); 
    printf("len %d\n\n", strlen(line)); 

這是輸出

line 
len 0 

line name 
len 4 

我的目標是解析組件的類型(^ A或^ B),然後獲取組件的名稱。 請幫忙指出如何解決這個問題。

+0

什麼是「二進制字符」?什麼是「非二進制字符」呢? –

回答

5

fgets和大多數<stdio.h>功能與文本,而不是二進制數據。

我認爲「字符」^@的二進制值0會混淆所有字符串處理函數。

您需要逐個字符讀取和/或不使用包含嵌入的零字節的對象的字符串函數。

+0

請注意,'fgets'讀取所有字節,包括''\ 0''和以下字節 - 但是,您不能在該數據上使用字符串函數。讀完第二行後,'line [4]'是'0',但是'printf(「%s \ n」,第5行)'outputs'「assembly1」'。 – pmg

+0

感謝pmg。答案和評論都有幫助。 – vinaym