バイナリデータを一気に配列に格納する方法について

解決


haru  2006-05-31 14:52:28  No: 62013  IP: 192.*.*.*

はじめまして。
今回、初めてWindowsソフトのプログラミングに挑戦する者です。

ファイルダイアログからファイルをバイナリデータをして
char型の配列に読み込み、
一部分を書き換えて別名ファイルとして保存しなおす
といったプログラムを考えています。

自分で調べた限りでは CArchive というのが便利そうだとわかり、
一応自分でコードを書いてみましたが使い方がわかりません。
(とリあえず一部分を書き換える処理は省略しました)

void CPtn2ptxDlg::OnButton1()  // File Open
{
// TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
  //-------------------------------------------■ここから追加
  CFileDialog myDLG( TRUE,"bin","*.bin", OFN_FILEMUSTEXIST | OFN_HIDEREADONLY,"ptnファイル(*.bin)|*.bin||");
  if(myDLG.DoModal() == IDOK){
    CStdioFile fin(myDLG.GetPathName(),CFile::modeRead | CFile::typeBinary);
    CArchive ar_fin(&fin, CArchive::load);
    char ss[65535];
    ar_fin >> ss;

    CStdioFile fout("hogehoge.bin",CFile::modeCreate | CFile::modeWrite | CFile::typeBinary);
    CArchive ar_fout(&fout, CArchive::store);

    ar_fout << ss;
                        }
  //-------------------------------------------■ここまで追加
}

ご指導よろしくお願いします。

編集 削除
RAPT  2006-06-01 01:23:56  No: 62014  IP: 192.*.*.*

CArchive でググったら、あっさりサンプルが見つかりましたが。

http://www.google.com/search?hl=ja&inlang=ja&ie=Shift_JIS&oe=Shift_JIS&q=CArchive&lr=lang_ja

編集 削除
RAPT  2006-06-01 01:33:08  No: 62015  IP: 192.*.*.*

というか、MSDNを見てみたら、char配列は使えないようですね。
使用できるデータ型やクラス型はMSDNに書いてあります。
この場合は、CStringクラスを用いるのが望ましいと思われます。

# 読み出しバイト数を指定できないのに、固定長のバッファに
# 読み込もうとするのは危険です。
## てか、スタックに64KBも・・・

編集 削除
RAPT  2006-06-01 01:37:36  No: 62016  IP: 192.*.*.*

# MSDN見ながら書いていたので、まとまりがなくてすみません。
バッファとサイズを指定して読み書きする、
CArchive::Read
CArchive::Write
が使えそうですね。

ref: MSDN

編集 削除
dairygoods  2006-06-01 08:59:52  No: 62017  IP: 192.*.*.*

char配列しか使わないなら、CFile::Read()で十分でしょう。

編集 削除
haru  2006-06-01 10:36:48  No: 62018  IP: 192.*.*.*

RAPT さん、dairygoods さん
ありがとうございました。
GetLength()を併用してサイズ指定することで読み書きできました。

>CArchive でググったら、あっさりサンプルが見つかりましたが。
>
>http://www.google.com/search?hl=ja&inlang=ja&ie=Shift_JIS&oe=Shift_JIS&q=CArchive&lr=lang_ja

は質問前に確認していたんですが、私はC言語(組み込み向け)は経験ありなのですが、C++やファイル操作は今回同時平行で勉強中でしてよく理解できなかったので…

もう少し基礎知識を優先的に学んだほうが良さそうですね。
ありがとうございました。

編集 削除