バイナリファイルの特定のデータを取得

[戻る]
みね 2005/03/08(火) 13:00:54
Win97+VC++6.0を使用し、ファイルをバイナリで開き
データを取得するプログラムを作成しております。

過去ログを参考にさせていただき、ファイル先頭から
データを取得しエディットボックスに

ADDRESS 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
0000000 7A 79 78 77 76 75 74 73 72 71 70 6F 6E 6D 6C 6B
0000010 6A 69 68 67 66 〜

のようにデータを表示する事は出来ました。
実際にはADDRESS 0000012 が 68 のように場所を指定してデータを
取得したいのですが、方法が判らずツマづいてます。

現在、読み込み部分は下記のような感じでやってます。

バイナリでファイルを開く部分
if(fp = fopen( myDLG.GetPathName(), "rb" )) == NULL ) 

1文字取得部分
while ((box = fgetc(fp)) != EOF) {

16進に変換部分
sprintf(asc,"%02X",box);

アドバイス頂けませんでしょうか?よろしくお願いします。

ku 2005/03/08(火) 13:20:36
fseek(fp, 0x12, SEEK_SET);
かな

PATIO 2005/03/08(火) 17:28:12
一気にメモリに読み込むのが難しいようなサイズを扱うのであれば、
ファイルから毎回読むという方法になると思うのですが、
一気に読める程度のものしか考えていないのであれば、
取り合えず、メモリ内に全て読み込んでしまって
メモリ上で処理してしまえば、もっと考え方は簡単になると思います。
ファイルのサイズを調べて、サイズ分のメモリを確保し、一気に読み込んでしまって
ファイルは閉じてしまいます。
あとは、メモリ上に読み込んだデータを参照して処理するだけで済むので
ファイルポインタを気にする必要はなくなります。

みね 2005/03/08(火) 18:24:11
kuさん、ありがとうございました。

fseek(fp, 0x12, SEEK_SET);
でファイルポインタの位置を移動して読み込むことで
欲しい情報が得られました。

実際は然程大きくないファイルなので
PATIO さんの方法もやってみたいのですが

BYTE配列に読み込むような感じなのでしょうか?

PATIO 2005/03/09(水) 09:57:57
> BYTE配列に読み込むような感じなのでしょうか?
そういうイメージでよいと思います。
freadという関数を調べてみてはどうでしょう。
多分、それで見当が付くと思います。
VC6についているHELPでfreadを調べれば、サンプルソースが出ていると思います。
基本的なファイル操作なので探せばWeb上でサンプルが見つかるかもしれません。

ちなみにWin97と書かれていますけれど、Win98の間違いでは?

みね 2005/03/09(水) 15:24:28
[[解決]]
お恥ずかしい Win98です。
解決チェックしておきます

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

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