バイナリデータ読み込み

[戻る]
ピースケ 2006/07/19(水) 15:32:56
環境 VC++ 6.0
OS windowsxp
ダイアログベースでクラスの新規作成 Genericクラス

お世話になります。

36 36 41 35 4C 31 30 30-2D 30 30 36 4B 00 48 2E
4B 41 53 48 4  4D 41 00-00 00 33 20 33 20 4D 35
・・・・・・

とゆうようなバイナリーデータを頭から2バイト,12バイト,12バイト,2バイト・・・
と変数に格納するプログラムを書いています(全部で256バイト)。

ファイルを開く事はCreateFileを使ってるのですが
読込みや変数への格納がいまいち分りません。
またreadfile はデータすべてを読み込んでくれるものと理解しています
(この場合は256全部読み込む)が合ってますか?
http://72.14.203.104/search?
q=cache:EiZXrCRUERAJ:www.microsoft.com/japan/developer/library/jpwinpf/_win32_r
eadfile.htm+ReadFile()&hl=ja&gl=jp&ct=clnk&cd=1&lr=lang_ja

どなたか分る方がいましたらよろしくお願い致します。


HANDLE  hf
LPSTR   strFile      // 入力データを格納する領域を指定します
DWORD  dwResult;  // 読み取ったバッファ
long    m_lAaa      // 最初の2バイト
CString m_szBbb     //  次の12バイト    
CString m_szCcc   //  次の12バイト    
CString m_szDdd   // 次の12バイト    


hF = CreateFile
(FilePath,ENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);

if (hF == INVALID_HANDLE_VALUE)
{
 return FALSE ;
}
 ReadFile(hF, strFile, GetFileSize(hFile , NULL), &dwResult, NULL);

//これ以降の処理で先頭2バイトを m_lAaa ・・・に格納する方法が不明

ku 2006/07/19(水) 17:38:39
受け取る領域がLPSTR   strFile;というのはまずいですね
LPSTRはポインタなので、読み込む値を格納する領域がありません

ファイルのサイズが256バイト固定でテスト的なコードとしては
unsigned char buf[256];
ReadFile(hF, buf, sizeof(buf), &dwResult, NULL);
unsigned short lo = buf[0];
unsigned short hi = buf[1] << 8;
m_lAaa = hi | lo;

hiとloはの値は逆かもしれない

ReadFile()の戻り値がTRUEならうまくいっているでしょう
確認のためdwResultを見ると良いかもしれない

ku 2006/07/19(水) 17:40:31
よく見てなかった・・・

PATIO 2006/07/20(木) 17:02:09
kuさんが書かれているように読み込みバッファはReadFileを呼び出す側で
用意する必要があります。ReadFileは引き渡された領域に読み込んだデータを
設定しているだけです。
ReadFileは指定されたサイズ分かEOFが現れるまでかの何れかまで読むので引き渡す
バッファは読み込みの最大サイズと同じだけ指定します。

関数の引数に引き渡す時にポインタになっているのは配列をそのまま引き渡せないからです。
ポインタを宣言して引き渡せば良い訳ではありません。
この辺は関数呼び出しの基本的なところなのでよく勉強してください。

効率は悪くなりますが、各変数に変数サイズ分ずつ読み込むという方法もあります。
実際には手段は色々考えられるはずなので自分でも考えて色々試して見ましょう。

PATIO 2006/07/20(木) 17:05:25
ちなみにunsigned char buf[256];で宣言してbufに読み込むとファイル上のイメージのま
まメモリ上に読み込まれます。
CopyMemory等の関数で各変数にコピーしたら良いのではないですかねぇ。
メモリ上にどういう順番で読み込まれているかを意識できれば、想像はつくはずなんです
けれど。

ピースケ 2006/07/20(木) 18:38:24
[[解決]]
こちらは間違えたスレッドですので解決します。

ピースケ 2006/07/20(木) 18:49:37
[[解決]]
話はもう一つのスレッドで続いています。

三草 2006/07/20(木) 18:57:38
↓本スレッドはこちらです。
http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200607/06070057.txt

とURLまで入れておけば、後から見た人は便利かもしれません。

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