2

私はWindows 7、64ビット、およびNTFSを使用しています。32 ビットでなければならない DLL を構築しています。C++ で実装したい非常に単純なルーチンがあります。次を使用して大きなファイルを読み取っています。

unsigned long p;
ifstream source(file);
streampos pp(p);
source.seekg(pp);

4GB を超えるファイルの場合、 unsigned long long を使用してみましたが、うまくいきません。私は何を間違っていますか?私は GNU GCC を使用していますが、MSVC Express 2008/2010 を試してみると役に立ちますか?

アップデート:

私のGCCに何か問題があるようです。現在、MSVC を使用してあなたの提案をテストしていますが、うまくいっているようです。MSVC は _int64 を使用して streampos/streamoff オブジェクトを表します。後で GCC で確認します。

4

3 に答える 3

2

32 ビット システムで実行している場合、単純な方法で実行するのはおそらく運が悪いでしょうが、ストリーム ライブラリはpos_type. ただし、相対シークを使用するとうまくいく場合があります。すべてのシークはおそらく現在の位置を示す a を返すためpos_type、これでもうまく機能しない可能性があります。

それは私だけだと思いますが、とにかくあまりにも有用であるとは思いませんでした. もちろん、この混乱を実装したことで、シークがパフォーマンスを低下さstd::ios_base::binaryせ、コード変換を使用しないモードで開かれたファイルを使用する場合にのみ実際に機能することも認識しています。

于 2012-02-23T01:21:52.337 に答える
1

代わりに、いくつかの相対シークを使用する必要がある場合があります。つまり、 の 2 つの引数のオーバーロードを使用しますseekg

// Start with seeking from the beginning
source.seekg(some_pos, std::ios::beg);

// Then seek some more from that position
source.seekg(some_offset, std::ios::cur);
于 2012-02-23T01:17:37.350 に答える
1

http://msdn.microsoft.com/en-us/library/aa365542(VS.85).aspxのようにこれを行うには、ネイティブの Win32 呼び出しを使用する必要があると思いますSetFilePointerEx

于 2012-02-23T01:20:15.223 に答える