2012-01-02 1 views
1

次のコード行は、符号なしのint値をファイルに書き込みますが、ファイルの内容は読み取れません。出力ファイルが壊れていたり、ガベージで埋められているのはなぜですか? (期待値)

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

両方の番号を読み取ることはできませんか? –

+1

対応するファイル内容/ファイルの16進ダンプと、その出力の期待値を含めてください。最初にstdoutにスローするのが最も簡単かもしれません。 –

+0

@JoachimPileborg出力の一部を投稿しました – John

答えて

5

あなたが期待するテキストの値を取得していない場合、それは(私はあなたがしようとしている変数をを埋めてきたと仮定していますが、誤った書式指定子を使用しているという事実のために、おそらくダウンですこれを確認してください)。

%lluは、と必ずしも同じ幅ではないunsigned long long intの明示的なものです。

C99では、inttypes.hには、正確な幅と-at-least-as-wide-asデータ型に使用する書式指定子のマクロがあります。例えば

:この場合

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

PRIu64は、64ビット幅の正確な変数のprintf形式指定子、符号なし10進数出力を意味します。さまざまな出力タイプに加えて、scanfファミリの等価物もあります(SCNで始まる)。

7.8.1 Macros for format specifiers(C99)のセクションに詳細がリストされています。


あなたは間違った番号を取得していないではなく、唯一のゴミとして記述することができるものになっている、あなたの更新に基づいて、私はあなたの問題は、他の場所にあると言うでしょう。壊れたポインタやデータがあっても、数値書式文字列の数値以外のデータはfprintfで生成されるとは思われません。それは確かにの可能性がありますが、それは未定義の動作ですが、非常にありそうもありません。

文字列の出力を取得することはできますが、ここでは該当しません。

つまり、(例として)メモリ破損の問題については、コード内の別の場所を見なければならないと思います。

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

と端末上で出てくるものを参照してください:あなたは問題があなたはそれがないと思うの行にあるかどうかをテストするために何ができる

ことの一つは、それを変更することです。

+1

'%'はinttypes.hのマクロには含まれていないので、フォーマット文字列でなければなりません。 –

+1

ああ、愚かな私、忘れてしまった。今修正しました、ありがとう、ジョアキム。 – paxdiablo

0

バイナリエディタでファイルの内容を確認し、実際の値と比較してくださいポリ構造。

問題が表示されます。

1

私たちがあなたを助けるためにコードの読み書き部分を共有する必要があるかもしれません。しかし、アウトファイルに書き込まれたコンテンツを見ると、フォーマット指定子の問題は、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; 
} 

ときreadingwritingfscanf()fprintf()format(第2引数)は、それぞれの行に一致しなければならないことに注意してください。

関連する問題