VC++6.0初心者です。
バイナリファイルの加工を行いたいのですが、テキスト系のプログラムしか作ったことが無いのでどうすればよいのか分かりません。
やりたいことは、
1、バイナリファイルを開いて2バイトずつ読み込む。
2、"FFD8"がきたら別ファイルにコピー開始。
3、"FFD9"がきたらコピー終了。
です。
大まかな手順がわかりません。
普段、テキストですとCStdioFileを使っていますが、これを使って開いてもよいのかどうかも分かりません(いろいろ調べはしましたがわかりませんでした)。
解決の手がかりやヒントをお教えいただければと思います。よろしくお願いいたします。
No.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();
}
何とか目的のプログラムを作る事が出来ました。
ただ、
if(bCopy == FALSE && wBuffer == 0xFFD8)
のところで、"0xFFD8"だと結果がうまくいかず"0xD8FF"にしたところ何とか目的の結果になりました。これがリトルエンディアンというやつでしょうか?
No.2
- 回答日時:
やり方はいろいろありますが、以下はその一例です
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進で書き出そうと思うですが、うまく出力されません。
よくわかりません。。
あ、わかりました。
while(1){
char sss[2];
if( fr.Read( sss, 2 ) == NULL ) break;
else{
fw.Write( sss, 2 );
}
}
でいいんですね
No.1
- 回答日時:
普通にfopenで開いてfwriteで書き込んではどうでしょう?
読み込みはfreadです。
参考URL:http://homepage3.nifty.com/mmgames/c_guide/17-02 …
ご回答ありがとうございます。
参考URLも拝見しました。
FILE *fp; などと宣言して普通に2バイト読み込み、バッファを介してfwriteで書き込むということですね。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
バッファとは何ですか
-
Microsoft VBAで2GBを超えるフ...
-
エラー:ストリームの終わりを...
-
VBA バイナリ―から文字列にす...
-
HDDのバイナリイメージの取得方...
-
【python】Excelファイルを読み...
-
24ビットのWaveデータの中身に...
-
ページ読み込み時に自動的にsub...
-
EOF
-
EXCEL VBAでテキストファイルの...
-
バイナリを16進数で表示したい
-
C++ Builderにおける画像データ...
-
読み込んだファイル
-
入力ファイルをバイナリにする利点
-
c言語についての質問です
-
画像の保存方法。
-
エクセルVBA 2千万行のCSVファ...
-
wave形式(*.wav)のフォーマット...
-
FTP転送
-
C言語初心者の質問失礼します。
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
バッファとは何ですか
-
Microsoft VBAで2GBを超えるフ...
-
ページ読み込み時に自動的にsub...
-
EOF
-
EXCEL VBAでテキストファイルの...
-
エクセルVBA 2千万行のCSVファ...
-
【python】Excelファイルを読み...
-
VBA バイナリ―から文字列にす...
-
入力ファイルをバイナリにする利点
-
バイナリエディタのつかいかた
-
エラー:ストリームの終わりを...
-
24ビットのWaveデータの中身に...
-
C言語とシリアル通信の送受信...
-
テキストデータをSQLServerに取...
-
バイナリーデータの一部データ...
-
削除したファイルの復旧、およ...
-
テキストデータをバイナリデー...
-
バイナリファイルの検索について
-
【Teraterm】filewritelnについて
-
PHPのfgetcsvの処理容量について
おすすめ情報