2016-03-22 1 views
1

fscanf()を使用して16進値を含む.datファイルを配列にスキャンしようとしています。私のプログラムは正常にファイルをスキャンし、配列に値を入れますが、私がそれらをコンソールに戻して印刷すると、値は大きく異なります。次のコードは、ファイルを開いてスキャンする私の関数です。私はそれの中に値 "1 2 3 4 5 6 7 8 9 a b c d e f"を持っているtest.txtファイルを使っています。私がプログラムを実行すると、コンソールで何が印刷されるかは、各実行後に "0 ffffffff 0 0 0"が続く5つの16進値になります。Cの配列に16進値をスキャンする際に問題があります

void sim(int bytes, int lines, int sets, int policy){ 
    int i = 0; 
    int total_Misses = 0; 
    int total_References = 0; 
    FILE *f1 = fopen("test.txt", "r"); 
    if (f1 == NULL){ 
     printf("File failed to open"); 
     exit(0); 
    } 
    unsigned int a[10]; 

    while (i < 10){ 

     fscanf(f1, "%x", &a[i]); 
     printf("%x ", a[i]); 
     i++; 
    } 
} 
+0

ファイルの外観は?実際にそこに10の値がありますか? 'fscanf'の結果を確認してください。 –

+1

この 'test.txt'ファイルはどのように作成しましたか?プレーンテキストエディタを使用した場合は、ファイルの先頭に[BOM](https://en.wikipedia.org/wiki/Byte_order_mark)を追加していないことを確認してください。コマンドラインで 'xxd test.txt'と入力して、それがどのように見えるかを見てください。 –

+2

'fscanf'が '間違った'値を出力すると仮定する前に、' 1'を正しく返すかどうかをテストするのに最適です。 – usr2564301

答えて

0

コードは問題なく表示され、すべてのコメントは入力の問題点を示しています。

while (i < 10){ 

    if (fscanf(f1, "%x", &a[i])==1) { 
     printf("%x ", a[i]); 
     i++; 
    } 
    else printf ("Error reading field %d\n", i); 
} 

P.s:a[10]が自動変数で、初期化されていません:私は、あなたがエラーをキャッチするために、次のコードを適応させることをお勧めします。したがって、配列エントリの値を読み取らないと、初期化されていないガベージ値が出力されます。

P.p .:多くの場合、scanf gurusが空白文字を追加して、先頭の空白をスキップする記号を%の前に追加します。

関連する問題