3

これをMinGW 32ビットで動作させようとして夢中になっています。私が試した他のすべてのプラットフォームで動作します。

私がしたいのは、4GBを超えるファイルのサイズを64ビットintに変換することだけです。

これは他のプラットフォームではうまく動作します:

#define _FILE_OFFSET_BITS   64
#include <sys/stat.h>

int64_t fsize(const char *filename) {
    struct stat st; 

    if (stat(filename, &st) == 0)
        return st.st_size;

    return -1; 
}

オンラインで見つけたさまざまな提案に基づいて、上記のコードの前に次の定義を追加してみました。

#define _LARGEFILE_SOURCE   1
#define _LARGEFILE64_SOURCE 1
#define __USE_LARGEFILE64   1

また試しました:

#ifdef __MINGW32__
#define off_t off64_t
#endif

そして最後に -D_FILE_OFFSET_BITS=64 を gcc フラグに追加しようとしました (ただし、上記の定義と同じはずです...)

運がない。返された int64_t は、まだ 32 ビット値に切り捨てられています。

MinGW 32ビットで64ビットのファイルサイズを決定する正しい方法は何ですか?

ありがとう!

4

4 に答える 4

4

皆さん、良い提案に感謝しますが、私はそれを理解しました... MinGW では、構造体 __stat64 と関数 _stat64 を有効にするためにこの定義が必要です。

#if __MINGW32__
#define __MSVCRT_VERSION__ 0x0601
#endif

次に、これは機能します:

int64_t fsize(const char *filename) {

#if __MINGW32__
    struct __stat64 st; 
    if (_stat64(filename, &st) == 0)
#else
    struct stat st; 
    if (stat(filename, &st) == 0)
#endif

        return st.st_size;

    return -1; 
}

これが誰かに役立つことを願っています。

于 2012-09-24T15:35:16.330 に答える
3

今のところMinGWは手元にありませんが、正しく思い出せば、を_stat64使用する関数がありstruct __stat64ます。あなたはおそらくいくつかの狡猾なマクロでこの醜さを隠したいと思うでしょう!

于 2012-09-22T00:04:53.730 に答える
0

lseek64それがMinGWパッケージに存在するかどうか試してみることができます

   #define _LARGEFILE64_SOURCE     /* See feature_test_macros(7) */
   #include <sys/types.h>
   #include <unistd.h>

   off64_t lseek64(int fd, off64_t offset, int whence);
于 2012-09-21T23:56:05.213 に答える