ヌル文字を含むバイナリファイルを読み込むには?

解決


ris  2007-11-25 00:25:22  No: 66962

こんにちは、初めまして。
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 も試してみたのですが結果は変わらずでした。


tetrapod  2007-11-25 03:24:08  No: 66963

提示コードで問題なく読み書きできるはずだと思われる
fgets では読めないのが当然
fread なら読めるはず
# ファイルが開けなかったとか内容が違っていたとかは無いとして

単にデバッガで char data[NNN]; を覗いてダメだーと判断してないか?
自動変数ウォッチ画面でなくメモリ表示画面で確認するべし


επιστημη  2007-11-25 03:27:01  No: 66964

- 読ませているファイルは"本当に"12byte以上ありますか?
- ReadFileの戻り値はTRUEですか?
- ReadFile後、readSizeの値は?


wclrp ( 'o')  2007-11-25 03:58:08  No: 66965

例が
>0xFF 0x00 0x00 0x80 0x80 0x80 0x00 0xFF 0x00
なのに
>colorInfo[1] = RGB(0xFF, 0xFF, 0xFF);  // 2つ目の色
だったり
>ReadFile(hFile, data, 12, &readSize, NULL);
このdataの構造体にアライメント(パディング)が無いのか
エンディアンとか関係ないのか
気になってしまう。


日吉  2007-11-25 05:06:58  No: 66966

ANSIビルドで、UNICODEファイルを読み込んでるとか、は関係ないか・・・

文字列関数使っているわけじゃないなら、上のコードで問題ないんでは?
そのバイナリファイルは、バイナリエディタで開ける?開けたらどういう風になってる?  自分も素人なんでわかりませんが・・・


ris  2007-11-25 05:37:05  No: 66967

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を読み込める方法(なりサンプルなり)を探していたのですが、
本当の問題点は自分のすぐそばにありました。

一週間程かかってしまいましたが、とてもいい勉強になりました。
皆様、どうもありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加