Streamクラスについて

[戻る]
YORK 2009/09/28(月) 10:11:38
ファイルの読み書きについて質問です。
ファイルサイズが4GBを超えるファイルを扱うため、
Streamクラスを使用しています。

が、4GBを超えた位置でSeekをすると意図していない位置にシークされてしまいます。
IStream::Seek()

が、同じ位置でReadをすると、意図している位置にポインタが移動します。

なにかご存じの方いらっしゃいますか?

IStreamは情報が少なくて困っています。

Readについては以下のサイトを見つけました。
http://msdn.microsoft.com/ja-jp/library/cc389764.aspx

環境VS2003.NET MFCを使用しています。

PATIO 2009/09/28(月) 11:12:25
素直にSetFilePointerExを使うと言う方法では駄目なんでしょうか?

MSのサイトの方はOLEDBを対象にした話みたいですし、
実際に.NET FrameworkのStreamクラスを使うと言う話と
OLEDBの話も繋がらないような気がします。

wood 2009/09/29(火) 01:28:10
Streamクラス とIStream は別物ですけど本当はどちらのご質問でしょうか?
もしかして、混同して使ってませんか?

YORK 2009/09/29(火) 09:22:02
すいません、混同していました。IStreamです。
http://74.125.153.132/search?
q=cache:NfVH6tLFdAIJ:lamoo.s53.xrea.com/develop/gdiplus/Stream.h+Stream.h+class+Stream&c
d=2&hl=ja&ct=clnk&gl=jp

上記サイトを参考に、IStreamをラッパして使用しています。

FileStream* pfStream;
pfStream = new FileStream(”ファイルパス”, STGM_READ);
for(int i = 0; i < 100; i++)
{
    // 情報読み込み
        unsigned int signature;
    pfStream->Read(&signature, sizeof(unsigned int));

    //あるデータは飛ばす
    pfStream->Seek(HogeDataSize, STREAM_SEEK_CUR);
}

ファイルの中の情報を取得する際、任意のデータを飛ばしながら読み込んでいると、
4GBを超えた際にRead&Seekをすると意図していない位置にシークされています。
なにか4GBの制限があるのでしょうか?

ryo 2009/09/29(火) 09:48:25
HogeDataSize
こいつの定義と使用方法(4G以上の値の入れ方)は?

YORK 2009/09/29(火) 10:02:10
情報不足でした。

//あるデータは飛ばす
UINT64 HogeDataSize = XXX;
pfStream->Seek(HogeDataSize, STREAM_SEEK_CUR);

XXXは固定値です。

@unsigned int signature を読みこむ。
AHogeDataSize分をシークする。
を繰り返しています。
Readするストリーム位置が4GBを超えるとおかしくなります。

tetrapod 2009/09/29(火) 11:25:20
なぜゆえに UINT64 なの?
http://msdn.microsoft.com/ja-
jp/library/system.runtime.interopservices.comtypes.istream.seek.aspx

YORK 2009/09/29(火) 13:56:46
[[解決]]
あ、INT64でしたね。
INT64 HogeDataSizeに直してみましたが結果は同じでした。

以下のように処理を変更すると4GB後も正常に動作しました。
次のsignatureの読み込み位置まで常に頭からシークするようにしました。

@unsigned int signature を読みこむ。
A頭からsignature + HogeDataSize分をシークする。

若干処理が遅くなりそうですが、解決策がなさそうなので
とりあえずこれでいこうと思います。

皆様、ありがとうございました。

古いスレッドには追加発言できません。