0

最後の行で「int 形式、異なる型の arg (arg 4)」というエラーが表示されます。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);
4

5 に答える 5

3

Unfortunately there is no format defined for off_t which may be any signed integer type, depending on the platform and also on some macros (that regulate if you may access files larger than 4 GiB, e.g.). You can't rely on anything of this. The best is to use "j" as a length modifier in your printf format and to cast your value to intmax_t.

于 2012-05-05T09:48:31.967 に答える
0

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

于 2012-05-05T09:38:03.817 に答える
0

タイプについては、次のoff_tように印刷する必要があります。

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

jフォーマッタのに注意してください。

于 2012-05-05T09:38:55.533 に答える
0

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

したがって、適切な呼び出しは次のようになります。

snprintf(buf,LINELEN,"File Size: %ld",info.st_size); 
于 2012-05-05T09:41:09.743 に答える
0

安全、正確、移植性を確保するために: たとえば、printf などに可変引数を渡すときは、コンパイルする場所で渡すものが同じ型ではない可能性がある場合は、常に明示的なキャストを含めます。たとえば、off_t が取得できると思われる大きさを計算し (long は、少なくともどこでも off_t と同じ大きさである必要があります)、それにキャストし、printf 形式が渡されることが安全にわかっている long を受け入れるようにします。変化する可能性のある型のキャストのない printf は、問題を引き起こしています。

于 2012-05-05T10:19:11.370 に答える