ショボ短歌会

VC++6.0初心者です。
バイナリファイルの加工を行いたいのですが、テキスト系のプログラムしか作ったことが無いのでどうすればよいのか分かりません。

やりたいことは、
1、バイナリファイルを開いて2バイトずつ読み込む。
2、"FFD8"がきたら別ファイルにコピー開始。
3、"FFD9"がきたらコピー終了。
です。

大まかな手順がわかりません。
普段、テキストですとCStdioFileを使っていますが、これを使って開いてもよいのかどうかも分かりません(いろいろ調べはしましたがわかりませんでした)。

解決の手がかりやヒントをお教えいただければと思います。よろしくお願いいたします。

A 回答 (3件)

確認してません。

動かないかも。
エラーチェックも省いてます。
void CHoge::Hoge(LPCTSTR szInFileName, LPCTSTR szOutFileName)
{
  CStudioFile fiHoge;
  CWordArray wArray;
  WORD wBuffer = 0;
  BOOL bCopy = FALSE;
  int nCount = 0;

  wArray.RemoveAll();

  fiHoge.Open(szInFileName, CFile::modeRead | CFile::typeBinary);
  while(1)
  {
    if(fiHoge.Read(&wBuffer, sizeof(WORD)) < sizeof(WORD))
    {
      break;
    }

    if(bCopy == FALSE && wBuffer == 0xFFD8)
    {
      bCopy = TRUE;
    }
    else if(bCopy != FALSE && wBuffer == 0xFFD9)
    {
      bCopy = FALSE;
    }
    else if(bCopy != FALSE)
    {
      wArray.Add(wBuffer);
    }
  }
  fiHoge.Close();

  fiHoge.Open(szOutFileName, CFile::modeWrite | CFile::typeBinary);
  for(nCount = 0 ; nCount < wArray.GetSize() ; wArray++)
  {
    fiHoge.Write(wArray.GetAt(nCount), sizeof(WORD);
  }
  fiHoge.Close();
}

この回答への補足

ソースまで書いていただいてありがとうございます。
大変参考になります。

変数はWORD型を使えば、判定も簡単に出来るんですね。

補足日時:2005/02/07 01:22
    • good
    • 0
この回答へのお礼

何とか目的のプログラムを作る事が出来ました。
ただ、
if(bCopy == FALSE && wBuffer == 0xFFD8)
のところで、"0xFFD8"だと結果がうまくいかず"0xD8FF"にしたところ何とか目的の結果になりました。これがリトルエンディアンというやつでしょうか?

お礼日時:2005/02/07 02:55

やり方はいろいろありますが、以下はその一例です



1.まず読込元ファイルをCStdioFileを使ってバイナリモードで開きます。(CFileを使って開いてはいけません)
2.CFile::Read()で読込元ファイルのデータを2バイトずつ読み込みます。
3.読み込んだデータが0xFFD8だったらコピーを開始します。
4.コピー開始後、読み込んだデータが0xFFD9ではなかったら出力先バッファにデータをコピーします。
5.読み込んだデータが0xFFD9だったらコピーを終了します。
6.読込元ファイル終端に達するまで3~5を繰り返します。
7.読込元ファイル終端に達したら読み込み元ファイルを閉じます。
8.CStdioFileで出力先ファイルをバイナリモードで開きます。
9.出力先バッファのデータをCFile::Write()で出力先ファイルに書き込みます。
10.出力先ファイルを閉じます。

データの大きさなどにより若干やり方が変化しますがおおよそこんな感じです

この回答への補足

ご回答ありがとうございます。

おかげで流れ図を頭の中で描くことができました。
ですが、とりあえず
while(1){
char sss[2];
char ch[10];
if( readfile.Read( sss, 2 ) == NULL ) break;
else{
wsprintf( ch, "%#x", sss );
writefile.Write( sss, strlen(sss) );
}
}

というふうにして全データを16進で書き出そうと思うですが、うまく出力されません。
よくわかりません。。

補足日時:2005/02/04 23:36
    • good
    • 0
この回答へのお礼

あ、わかりました。

while(1){
char sss[2];
if( fr.Read( sss, 2 ) == NULL ) break;
else{
fw.Write( sss, 2 );
}
}

でいいんですね

お礼日時:2005/02/05 01:27

普通にfopenで開いてfwriteで書き込んではどうでしょう?


読み込みはfreadです。

参考URL:http://homepage3.nifty.com/mmgames/c_guide/17-02 …
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

参考URLも拝見しました。
FILE *fp; などと宣言して普通に2バイト読み込み、バッファを介してfwriteで書き込むということですね。

お礼日時:2005/02/02 15:35

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!