こんにちは、初めまして。
VC6++のSDKでバイナリ操作アプリケーションを作ろうとしています。
バイナリファイルを読み込んで、それを3バイトずつ配列に入れるところで
行き詰っております。
読み込むファイルは 0x00 から 0xFF までの色情報(R G B)が連続して
入っています。例えば、赤・灰・緑ですと、
0xFF 0x00 0x00 0x80 0x80 0x80 0x00 0xFF 0x00
のように並んでいます。
これを以下のようにして配列に格納したいのです。
colorInfo[0] = RGB(0xFF, 0x00, 0x00); // 1つ目の色
colorInfo[1] = RGB(0xFF, 0xFF, 0xFF); // 2つ目の色
colorInfo[2] = RGB(0x00, 0xFF, 0xFF); // 2つ目の色
しかし、どうしても、0x00で読み込むのをやめてしまうようで、
ファイル全体の内容を取得することが出来ません。
色々と試行錯誤してみましたが、成果は得られませんでした。
どなたかご指摘頂けないでしょうか?
宜しくお願い致します。
以下は、私が書いたコードです。(要点だけをまとめました)
// ファイル名filePathを読み込む
HANDLE hFile = CreateFile(filePath, GENERIC_READ, FILE_SHARE_READ,
NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
DWORD fileSize = GetFileSize(hFile, NULL);
DWORD readSize;
// 色4つをdataに読み込む
ReadFile(hFile, data, 12, &readSize, NULL);
CloseHandle(hFile);
# fread fgets も試してみたのですが結果は変わらずでした。
提示コードで問題なく読み書きできるはずだと思われる
fgets では読めないのが当然
fread なら読めるはず
# ファイルが開けなかったとか内容が違っていたとかは無いとして
単にデバッガで char data[NNN]; を覗いてダメだーと判断してないか?
自動変数ウォッチ画面でなくメモリ表示画面で確認するべし
- 読ませているファイルは"本当に"12byte以上ありますか?
- ReadFileの戻り値はTRUEですか?
- ReadFile後、readSizeの値は?
例が
>0xFF 0x00 0x00 0x80 0x80 0x80 0x00 0xFF 0x00
なのに
>colorInfo[1] = RGB(0xFF, 0xFF, 0xFF); // 2つ目の色
だったり
>ReadFile(hFile, data, 12, &readSize, NULL);
このdataの構造体にアライメント(パディング)が無いのか
エンディアンとか関係ないのか
気になってしまう。
ANSIビルドで、UNICODEファイルを読み込んでるとか、は関係ないか・・・
文字列関数使っているわけじゃないなら、上のコードで問題ないんでは?
そのバイナリファイルは、バイナリエディタで開ける?開けたらどういう風になってる? 自分も素人なんでわかりませんが・・・
tetrapodさん、επιστημηさん、
wclrp ( 'o')さん、日吉さん
返信どうもありがとうございます。
結論を先に言わせて頂きますと、皆様のおかげで無事に読み込みに成功いたしました。
# お恥ずかしいミスでして、大変申し訳なく思います。
> - 読ませているファイルは"本当に"12byte以上ありますか?
> - ReadFileの戻り値はTRUEですか?
> - ReadFile後、readSizeの値は?確認してみました。
なんと、あるときとないときがありました!
エラーにならなかったので気付かなかったのですが、
> そのバイナリファイルは、バイナリエディタで開ける?
バイナリエディタというものを
ダウンロードして確認することが出来ました。
これのせいで、意味の分からない値が入ってきていたのだと思います。
さらに、
> メモリ表示画面
というものがあるのも知りませんでした。
デバッグにも慣れていないので、これから勉強していきます。
ありがとうございます。
また、
> 例が
> >0xFF 0x00 0x00 0x80 0x80 0x80 0x00 0xFF 0x00
> なのに
> >colorInfo[1] = RGB(0xFF, 0xFF, 0xFF); // 2つ目の色
> だったり
これは私の写し間違いで起こってしまいまして、
混乱させてしまったことをお詫びいたします。
申し訳ございません。
必死にNULLを読み込める方法(なりサンプルなり)を探していたのですが、
本当の問題点は自分のすぐそばにありました。
一週間程かかってしまいましたが、とてもいい勉強になりました。
皆様、どうもありがとうございました。
ツイート | ![]() |