2016-02-28 321 views
1

我在嘗試將二進制文件轉換爲文本文件時出現問題。現在,我得到了「你好16」的輸出。我應該得到5行輸出,其中第一行應該是「你好32」。我不確定我哪裏出了問題,但我一直試圖找出幾個小時。 Link to Binary File將二進制文件轉換爲C中的文本文件

void BinaryToText(char *inputFile, char *outputFile) { 
    unsigned char str[256]; 
    unsigned int num; 
    int fileLen; 

    FILE *finp; 
    FILE *fout; 

    finp = fopen(inputFile, "r"); 
    fout = fopen(outputFile, "w"); 

    fseek(finp, 0, SEEK_END); 
    fileLen = ftell(finp); 
    fseek(finp, 0, SEEK_SET); 

    while (fread(&fileLen, sizeof(char), 1, finp) == 1) { 
     fread(&str, sizeof(str), 1, finp); 
     fread(&num, sizeof(int), 1, finp); 
     fprintf(fout, "%s %d\n", str, num); 
    } 
    fclose(finp); 
    fclose(fout); 
} 
+0

硬不格式的細節來回答二進制文件 – user3528438

+0

剛更新說明鏈接到二進制文件 –

回答

1

您的二進制文件格式似乎尷尬:

  • 您打開"r"輸入文件:應該以二進制模式"rb"打開。
  • 您首先嚐試使用ftell()確定文件大小。請注意,這不適用於管道和設備。在你的情況下,無論如何你都不會使用fileLen
  • 在循環:
    • 你看,你在fileLen一部分存儲單個字節。
    • 然後您讀取一個256字節的字符串。
    • 您直接讀取一個數字,假定您所期望的字節順序和大小爲int
    • 然後你打印字符串,假設文件中有,否則你會調用未定義的行爲。

這是很難說什麼是錯的沒有看到寫代碼。

請注意,二進制文件應該打開"rb"以防止在某些平臺(特別是Windows)上進行換行序列的虛假轉換。

編輯:

形式在評論中提供的額外信息,這裏是一個修改後的版本應該分析你的二進制文件更爲恰當:

void BinaryToText(char *inputFile, char *outputFile) { 
    unsigned char str[256]; 
    unsigned int num; // assuming 32 bit ints 
    int i, len; 

    FILE *finp = fopen(inputFile, "rb"); 
    FILE *fout = fopen(outputFile, "w"); 

    while ((len = fgetc(finp)) != EOF) { 
     fread(str, len, 1, finp); 
     str[len] = '\0'; 
     num = (unsigned int)fgetc(finp) << 24; 
     num |= fgetc(finp) << 16; 
     num |= fgetc(finp) << 8; 
     num |= fgetc(finp); 
     fprintf(fout, "%s %d\n", (char*)str, num); 
    } 
    fclose(finp); 
    fclose(fout); 
} 
+0

[鏈接] https://gyazo.com/7252ca6fa6f36a1f430c93839cdd9110 編輯:這是一個圖片的二進制文件我無法粘貼它到代碼塊 –

+0

@AlexPurpleHosein:發佈產生二進制文件的代碼會更有用。規範似乎不正確。 – chqrlie

+0

這是給定的輸入和輸出文件,我需要匹配沒有產生它的當前代碼[鏈接] https://gyazo.com/6837218c5e35909b9ce69f0f25cbbc2b –

相關問題