2011-06-29 16 views
1

ファイルからデータを読み取っています。フォーマットは、UNIXスタイル 行末、16進数で32ビット符号付き整数 一連の被ファイルから16進データを読み取るfscanf形式コンパイル時の警告

ASCIIテキストに記載されています。

例えば

08000000 

私はこのデータを読み込む関数fscanfを使用しています。

long data_size; 

FILE *fp; 
fp=fopen("test01.bin", "r"); // open for reading 
if (fp==0) {cerr << "Error openeing file"<<endl; return 1;} 

fscanf(fp, "%x", &data_size); 

しかし進値が符号なしで、この問題の長い用量にキャストされているすべては私のテストファイルを使用して[OK]を実行しますが、私はコンパイル時の警告を取得し、

warning: format ‘%x’ expects type ‘unsigned int*’, but argument 3 has type ‘long int*’ 

?長い間、サインを知らせるように最重要ビットを取るでしょうか?それとも、私は問題に終わるでしょうか?または私は私の理解の印をよく捨てていますか?

おかげ

答えて

0

あなたは警告状態と同じポインタ型をサポートする必要があり、さもなければ、あなたは他のアーキテクチャへの移植にしたい場合は、深刻なトラブルにあなたのコードを実行します:longが持っている(例えば64ビットアーキテクチャ) intとは異なるサイズです。ポインタを使用している場合、これは特に難しいことです。 (以前はという問題がありました。この問題はでした)

int data_sizeを使用すると問題ありません。

+0

おかげで、これは、異なるマシン上で実行されます。したがって、16進値が32ビットでintが16ビットであっても、int data_sizeを使用しても問題ありませんか? (私は長いことを理解している32ビットですか?)。 – Tommy

+0

@ Tommy、おそらく、 ''の 'int32_t'型を見てみたいです。 '(u)intN_t'がNビット長であることが保証されています:http://linux.die.net/man/3/int32_t – Joulukuusi

+0

残念ながら、' long'と 'int'のサイズはシステムアーキテクチャに依存します。しかし、32ビットオペレーティングシステムでは、intとlongは32ビットのサイズが等しいと思います。 16ビット(16と32ビット)と64ビット(32と64?)のシステムでのみ、これは問題を引き起こす可能性があります。私はその数について本当に分かりません。 ** Hex **文字列自体には「長さ」がありません。任意の数値を16進文字列にエンコードできます。もちろん、数値が変数に収まらない場合は、オーバーフローが発生する可能性があります。その場合、エラーが設定されると思います。 – Constantinius

0

問題は%xに値を読み取るのにunsigned int *が必要ですが、long *があることです。 <stdint.h>ヘッダは、固定長の値タイプを提供し、<inttypes.h>は、対応するマクロをprintf,scanf、およびその派生と一緒に使用するために定義します。私はあなたが<inttypes.h>が提供するマクロを使用してint32_t変数にデータをfscanfすることがより良いだろうと思う:警告のため

#include <inttypes.h> 

... 

int32_t data_size; 
fscanf(fp, "%" SCNx32, &data_size); 
+0

おかげでマクロが見つかりましたhttp://linux.die.net/man/3/scnx32 – Tommy

関連する問題