0

stackoverflow に関する多数のレポートを読んだ後、バイナリ ファイルをすばやく操作するために FILE* (std::fstream 経由) を使用することにしました。さらに、プロセス中にファイルを切り詰める必要があり (_chsize または ftruncate)、これはファイル記述子 (fileno 呼び出し) でのみ機能します。

だから私はこのようなものを働かせようとしています(C++):

#define _FILE_OFFSET_BITS 64
#include <stdio.h>
static inline off_t FTello(FILE *stream)
{
#if _WIN32
#if defined(__MINGW32__)
  return ftell( stream ); // 32bits
#else
  return _ftelli64( stream );
#endif
#else
  return ftello( stream );
#endif
}

ただし、これは明らかに Visual Studio では機能しません。ドキュメントのどこにも、コンパイル時に off_t のサイズを変更する方法が見つかりませんでした。

次のような署名を作成するのは魅力的です (C99: stdint.h があると仮定します)。

static inline int64_t FTello(FILE *stream)

他の人は何をしていますか?

参考までに、私が読んでいるものは次のとおりです。これは、FILE* がより優れたパフォーマンスを提供することを示しているようです。

4

1 に答える 1

1

すでに大きなファイルのサポートを強制している場合は、int64_t を返すように FTello() を定義するだけです。

ただし、inttypes.h は stdint.h より移植性が高いと思われるかもしれません。

MS は、似たような名前の関数を提供しているにもかかわらず、UNIX と互換性があることで有名ではありません。互換性レイヤーを提供する場合は、既存のレイヤーの機能 (boost.filesystem など) をよく調べてください。どこにでも微妙な点があります。

ちなみにboost.filesystemにはresize_file()があります。

于 2013-07-25T19:04:19.850 に答える