Streamクラスについて – プログラミング – Home

通知
すべてクリア

[解決済] Streamクラスについて


YORK
 YORK
(@YORK)
ゲスト
結合: 15年前
投稿: 10
Topic starter  

ファイルの読み書きについて質問です。
ファイルサイズが4GBを超えるファイルを扱うため、
Streamクラスを使用しています。

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

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

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

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

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

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


引用未解決
トピックタグ
PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

素直にSetFilePointerExを使うと言う方法では駄目なんでしょうか?

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


返信引用
wood
 wood
(@wood)
ゲスト
結合: 23年前
投稿: 895
 

Streamクラス とIStream は別物ですけど本当はどちらのご質問でしょうか?
もしかして、混同して使ってませんか?


返信引用
YORK
 YORK
(@YORK)
ゲスト
結合: 15年前
投稿: 10
Topic starter  

すいません、混同していました。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
 ryo
(@ryo)
ゲスト
結合: 23年前
投稿: 252
 

HogeDataSize
こいつの定義と使用方法(4G以上の値の入れ方)は?


返信引用
YORK
 YORK
(@YORK)
ゲスト
結合: 15年前
投稿: 10
Topic starter  

情報不足でした。

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

XXXは固定値です。

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


返信引用
tetrapod
 tetrapod
(@tetrapod)
ゲスト
結合: 21年前
投稿: 830
 

なぜゆえに UINT64 なの?
http://msdn.microsoft.com/ja-
jp/library/system.runtime.interopservices.comtypes.istream.seek.aspx


返信引用
YORK
 YORK
(@YORK)
ゲスト
結合: 15年前
投稿: 10
Topic starter  

あ、INT64でしたね。
INT64 HogeDataSizeに直してみましたが結果は同じでした。

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

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

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

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


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました