2012-01-02 55 views
1

以下代碼行將無符號整型值寫入文件,但該文件的內容不可讀。爲什麼輸出文件損壞/被垃圾填滿? (期待號碼)

struct rabin_polynomial 
{ 
    uint64_t start; 
    uint16_t length; 
    struct rabin_polynomial *next_polynomial; 
}; 

fprintf(out_file, "%llu,%u",poly->start,poly->length); 

如果我將代碼的輸出代替顯示在命令行屏幕上,它是可讀的。

文件「out_file」未以二進制模式打開。輸出文件的內容

以下部分:

-ÍÍÍÍÍÍp\y";^æó r\ ÍÍÍÍ-  ÍÍÍÍÍÍ 
Ø∿»Iðr\ ÍÍÍÍ-  wÍÍÍÍÍÍ7OT-OØÚ‚\ ÍÍÍͤ*  L ÍÍÍÍÍÍî›ùçÉç`‚\ ÍÍÍÍð3  ÍÍÍÍÍÍ 
Ø∿»I°‚\ ÍÍÍÍðC  ÍÍÍÍÍÍíK¬è‹Ç{ ƒ\ ÍÍÍÍðS  • ÍÍÍÍÍÍ-Ló3lJ–ÞPƒ\ ÍÍÍÍ…] 

這裏是進出料口地說:

0,2861 
2861,4096 
6957,3959 
10916,2380 
13296,4096 
17392,4096 
+1

這兩個數字都不可讀,或者只有其中一個? – 2012-01-02 08:44:20

+1

請包含相應的文件內容/文件十六進制轉儲以及所述輸出的預期值。把它們先扔到標準輸出可能是最簡單的。 – 2012-01-02 08:51:04

+0

@JoachimPileborg我已經發布了部分輸出 – John 2012-01-02 09:12:51

回答

5

如果你沒有得到你所期望的文本值,它是可能下降的事實,您正在使用不正確的格式說明(我假設你你想填充變量打印在這裏,雖然你可能想確認這一點)。

%llu明確表示爲unsigned long long int,其寬度不一定與uint64_t相同。

在C99中,inttypes.h擁有用於格式說明符的宏,用於精確寬度和-at-least-as-wide-as數據類型。

例如:

uint64_t xyzzy = 42; 
printf ("Number is: %" PRIu64 "\n", xyzzy); 

在這種情況下,PRIu64printf格式說明,無符號十進制輸出,對於一個64位的精確寬度可變。有各種各樣的輸出類型,以及scanf家族的等價物(以SCN開頭)。

C99的7.8.1 Macros for format specifiers部分詳細列出了它們。


根據您的更新,你就別想不正確的數字但而得到什麼只能被描述成垃圾,我會說你的問題在其他地方。即使有損壞的指針或數據,我也不希望fprintf爲數字格式字符串生成非數字數據。這肯定是可能,因爲它是未定義的行爲,但不太可能。

可能得到這種輸出的字符串,但這不是這種情況。

換句話說,我認爲你必須在你的代碼的其他地方查找(作爲例子)內存損壞問題。

有一兩件事你可以做測試,如果問題出在你認爲它的線,是將其改爲:

printf("DEBUG: %llu,%u\n",poly->start,poly->length); 
fprintf(out_file, "%llu,%u",poly->start,poly->length); 

,看看在終端上散發出來。

+1

'%'不包含在inttypes.h的宏中,因此它仍然必須在格式字符串中。 – 2012-01-02 08:47:36

+1

哦,傻了,忘了。現在修復,謝謝@Joachim。 – paxdiablo 2012-01-02 08:48:43

0

請檢查文件的內容以十六進制編輯器,並與實際值進行比較聚結構。

你會看到什麼是問題。

1

您可能必須分享您的讀寫代碼部分,以便我們爲您提供幫助。但是看看寫入out文件的內容,看起來像fprintf()fscanf()中的格式說明符存在問題。

以下程序可能會爲您提供參考。

#include <stdio.h> 
#include <stdlib.h> 

#define LEN 6 

int main(void) 
{ 
    unsigned long long start[LEN] = {0, 2861, 6957, 10916, 13296, 17392}; 
    unsigned short int length[LEN] = {2861, 4096, 3959, 2380, 4096, 4096}; 
    int i; 
    unsigned long long s; 
    unsigned short int l; 
    FILE *out_file, *in_file; 

    if ((out_file = fopen("out_file", "w")) == NULL) { 
     printf("ERROR: unable to open out_file\n"); 
     return -1; 
    } 

    for (i=0; i<LEN; i++) 
     fprintf(out_file, "%llu,%hu \n",start[i], length[i]); 

    fclose(out_file); 


    if ((in_file = fopen("out_file", "r")) == NULL) { 
     printf("ERROR: unable to open out_file\n"); 
     return -1; 
    } 

    for (i=0; i<LEN; i++) { 
     fscanf(out_file, "%llu,%hu \n", &s, &l); 
     printf("start = %llu - length = %hu \n", s, l); 
    } 

    fclose(in_file); 

    return 0; 
} 

請注意:format(第二個參數)在fscanf()fprintf()必須分別readingwriting線時相匹配。