![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
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で質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/07/21 09:42
- Excel(エクセル) VBA 特定の列に入っているテキストをコピペ 2 2023/06/14 11:24
- バックアップ Windows11パソコンのデータを数クリックで完全に引っ越しするにはどうすれば良いでしょうか? 5 2022/10/11 14:08
- Google+ Googleのドキュメントの使い方を教えて貰いたいです。 書いたものを共有して格納場所に入れて 毎日 2 2022/05/02 10:55
- C言語・C++・C# C# で、あるフォルダー内にあるすべてのテキストファイルを別のフォルダーにコピーする。 4 2022/11/21 13:23
- 電子マネー・電子決済 QUICPayの登録ができない。 4 2023/06/10 10:57
- Outlook(アウトルック) 【 Windows 10 】アドレス帳に正しくインポートを完了させたい。 3 2023/04/23 13:41
- Visual Basic(VBA) Access VBAから使用したExcelプロセスを閉じる方法について 4 2022/06/08 17:50
- 国家公務員・地方公務員 公務員試験の数的処理で苦戦しています。 1 2023/01/30 08:56
- Word(ワード) テキストデータのPDFをWordで開くとテキストが図として認識されてしまう 3 2023/01/24 11:38
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
バッファとは何ですか
-
入力ファイルをバイナリにする利点
-
ROM書き込みデータのファイル形...
-
ページ読み込み時に自動的にsub...
-
EOF
-
エラー:ストリームの終わりを...
-
バイナリファイルの検索について
-
デバイスファイルに書き込むこと
-
MacからWinにファイルを添付す...
-
テキストデータをバイナリデー...
-
バイナリーデータの一部データ...
-
Javaでのエンディアン変換
-
Accessからのソケット通信について
-
FTPを使わないファイルアップロ...
-
エンディアンと2の補数表現
-
【MFC】CFileでSeekした位置か...
-
バイナリ形式のXMLファイルを読...
-
どんなプログラムを書いても指...
-
C言語初心者の質問失礼します。
-
フルパスから最後のディレクト...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
バッファとは何ですか
-
Microsoft VBAで2GBを超えるフ...
-
EXCEL VBAでテキストファイルの...
-
VBA バイナリ―から文字列にす...
-
バイナリエディタのつかいかた
-
エクセルVBA 2千万行のCSVファ...
-
EOF
-
ページ読み込み時に自動的にsub...
-
エラー:ストリームの終わりを...
-
画像の保存方法。
-
【python】Excelファイルを読み...
-
MacからWinにファイルを添付す...
-
入力ファイルをバイナリにする利点
-
EXCEL VBAで、バイナリデータの...
-
PHPのfgetcsvの処理容量について
-
VBAを使って、一部バイナリデー...
-
HDDのバイナリイメージの取得方...
-
FTPでエクセルをPUTするとファ...
-
リストビュー ⇔ 別ファイル構...
-
クリップボードからファイル名...
おすすめ情報