2011-06-29 16 views
2

C/C++には新しく、ここでは苦労しています。私は読み込みたい16進数の32ビット符号付き整数の.binファイルを持っています。最初の2つの数字を読み込む必要があります。これらはデータの残りの部分についての情報が含まれていますが、これも正しくできません。テストファイルは、最初の2つの数字が私のコードを実行しているようC言語での32ビットバイナリでの読み込み

00000004 
00000003 

を持っている私に私のデータサイズ変数の808464394を提供します。私はprintf形式を%lxとして指定しようとしましたが、それだけでprintf形式に苦しんでいます。

私は長整数型を選択しましたが、これは最善の選択であるように長い署名が32ビットであることを理解しています。後で、私は各長いものを切り刻み、長い間のビットのグループを見る必要があります。

誰かが私が欲しいものではない数字がプリントアウトされている理由についてアドバイスをしてもらえますか?また、long intが適切なデータ型でない場合は、別の方法を提案してください。

以下のコードが添付されています。

は、あなたが直接メモリ内の数値に数値の小数表現を読んでいる

int getsizes(long &data_size, long &image_size); 

int main() 
{ 

    long* data = NULL; // pointer of arry we will read data into. 
    long data_size, image_size; 

    // get data_size and image_size from task1.bin 

    if (getsizes(data_size,image_size)) cerr << "Error getting data_size,image_size" ; 


    int Idata_size = (int) data_size; // creat my array to store rest of file in 
    data = new long[Idata_size]; 

    // get rest of data (still to do) 

    // interprate data operations (still todo). 


    delete [] data; // freeing memory just for completeness even though program is about to exit. 
    data = NULL; 

    return 0; 
} 


\\functions 


int getsizes(long &data_size, long &image_size) 
{ 

    FILE *fp; 


    fp=fopen("test01.bin", "rb"); // open for reading 
    if (fp==0) cerr << "Error openeing file"<<endl; 

    fread(&data_size, sizeof(data_size), 1, fp); //sizeof(data_size) should be 32 

    fread(&image_size, 32, 1, fp); 

    #ifdef DEBUG 
    printf ("data_size= %ld \n", data_size); 
    cout <<"call4" <<endl; 
    printf ("image_size= %ld \n", image_size); 
    #endif 

    fclose(fp); // 

    return 0; // succsess. 

} 
+0

ファイルを書き込むコードを表示できますか? –

+0

私はファイルとステートメントを持っているだけです。ファイルはUNIXスタイルの行末のASCIIテキストで、16進数の32ビット符号付き整数で構成されています。 – Tommy

+0

16進エディタまたは通常のテキストエディタを使用してファイルの内容を検査していますか?テキストエディタで '00000001'が表示されている場合、これはバイナリファイルではなく、@ Marceloの答えは正しいです。 –

答えて

4

ありがとうございます。番号808464394は0x30303030で、これはASCIIとして解釈されるとき、4つのゼロ(入力ファイルの最初の4バイト)のシーケンスです。

freadの代わりにfscanfを使用してください。

+0

ありがとうございました。私はscanfで読んでみましょう。 – Tommy

+0

@Tommy:probsはありません。ところで、私はタイプミスを修正しました - それは 'scanf'ではなく' fscanf'だったはずです。 –

1

もう1つの問題は、テスト入力がバイナリファイルではなく、テキストファイルであることです。

バイナリファイルは一般的に別のプログラムで作成され、メモ帳で開くと解読不能なシンボルが表示されます。ファイルを開くときにファイル全体を読むことができる場合

関連する問題