
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を見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
バッファとは何ですか
-
Microsoft VBAで2GBを超えるフ...
-
入力ファイルをバイナリにする利点
-
バイナリ形式のXMLファイルを読...
-
ページ読み込み時に自動的にsub...
-
バッファサイズについて
-
FTP転送
-
プログラミング初心者です。プ...
-
バイナリって
-
EXCEL VBAでテキストファイルの...
-
ビットマップファイル生成(C言...
-
バイナリーデータの一部データ...
-
C言語初心者の質問失礼します。
-
Wordファイルの結合
-
ファイル形式またはファイル拡...
-
SGファイルって何ですか?
-
フルパスから最後のディレクト...
-
シェルコマンドの 2>&1 とはど...
-
FTPでputすると空ファイルが出...
-
営業秘密の漏洩について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
バッファとは何ですか
-
Microsoft VBAで2GBを超えるフ...
-
VBA バイナリ―から文字列にす...
-
エラー:ストリームの終わりを...
-
EOF
-
EXCEL VBAでテキストファイルの...
-
C言語の質問です。バイナリ形...
-
MacからWinにファイルを添付す...
-
エクセルVBA 2千万行のCSVファ...
-
Javaでのエンディアン変換
-
入力ファイルをバイナリにする利点
-
テキストデータをSQLServerに取...
-
【MFC】CFileでSeekした位置か...
-
【python】Excelファイルを読み...
-
fscanf? 外部ファイル(時刻表...
-
C言語とシリアル通信の送受信...
-
ページ読み込み時に自動的にsub...
-
【Teraterm】filewritelnについて
-
C言語でBMPファイルの内容を表...
-
コンピュータ系にはめっぽう弱...
おすすめ情報