2012-05-05 22 views
0

最後の行に "int format、different type arg(arg 4)"エラーが表示されます。私はちょうどintにキャストすべきか、これを処理する良い方法がありますか?キャストoff_t to int

struct stat info; 
if (stat(file_path, &info) == -1 || errno == ENOENT) 
    return -1; 

if (stat(file_path, &info) != -1) 
{ 
    char buf[LINELEN]; 
    snprintf(buf,LINELEN,"File Size: %d",info.st_size); 
+3

'printf'についての悪いことは、私には本当に悲しいことですが、まさにフォーマット文字列のこの問題です。いくつかの設定に応じて 'uint32_t'または' uint64_t'に型をtypedefするコードを想像してみてください。これらの変数を単に出力することはできません。しかし、問題なく最も確実に動作するソリューションは、引数を想定できる最大サイズにキャストすることです。たとえば、 'printf("%lu "、(unsigned int)info.st_size);'はサイズに関係なく正しく印刷されます。引数がキャストより大きい場合のみ問題です。あなたはデータを失いますが、それでもUBは避けてください。 – Shahbaz

答えて

0

代わりに%ld形式を使用してください。プラットフォームによって異なりますが、通常、off_tはlongと定義されています。署名されていない場合もあります。その場合は、%luを使用してください。

0

off_tタイプの場合、あなたはこのようにそれを印刷する必要があります

snprintf(buf,LINELEN,"File Size: %jd",info.st_size); 

お知らせフォーマッタでj

+0

"j"形式は '{u} intmax_t'用です。だから確実にそのタイプにキャストする必要があります。 –

0

st_sizeは、実際にはlongのタイプoff_tです。

だから、適切な通話がしなければならない:

snprintf(buf,LINELEN,"File Size: %ld",info.st_size); 
+0

「本当に長い」?任意の符号付き整数型を指定できます。 –

+0

"j"修飾子はすべての実装に存在すると思いますか?それが長いと仮定すると安全です。 'snprintf(buf、LINELEN、"ファイルサイズ:%ld "、(long)info.st_size);' –

+0

"j"修飾子はC標準の一部です。 AFAIRこれはC99以来そうです。 –

3

は、残念ながら任意の符号付き整数型であってもよいoff_tに定義されたフォーマットを使用すると、アクセス可能な場合には、規制(プラットフォームにもいくつかのマクロによっては、ありません例:4 GiBより大きいファイル)。あなたはこれに頼ることはできません。最良の方法は、printf形式の長さ変更子として "j"を使用し、値をintmax_tにキャストすることです。

0

あなたがコンパイルする場所に渡すものが同じ型でない場合、varargsを渡すときには常に、例えばprintfに明示的なキャストを含めてください。たとえば、off_tがどの程度の大きさを取ることができるかを考えてみましょう。(少なくともどこでもoff_tと同じくらい長いはずです)、キャストして、あなたのprintf形式があなたが今渡されることを安全に知っていることを確認してくださいさまざまな種類のキャストのないprintfが問題を尋ねています。

関連する問題