こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

バイナリファイルをテキストファイルに変換する方法を教えて頂けませんか。

こんにちは。

バイナリファイルをテキストファイルのように読み込んだり、書き込んだりすることは可能でしょうか。バイナリファイルをテキストファイルとして扱う良い方法があれば是非ご教授頂きたいです。
以下は自分なりに考えたプログラムなのですが、すごく文字化けして出力されてしまいます。どこがいけないんでしょうか。

####プログラム####

#include<stdio.h>

int main(){
FILE *fp,*fp2;
char str[1024];

//file.txtはバイナリファイルなのでバイナリモードで開く
if((fp = fopen("file.txt","rb")) == NULL){
printf("file.txt:open error");
exit(-1);
}

//out.txtはテキストファイルとして保存したいのでテキストモードで開く
if((fp2 = fopen("out.txt","at")) == NULL){
printf("out.txt:open error");
exit(-1);
}

//一行ずつバイナリファイルをテキストファイルにして保存
while((fgets(str,1024,fp)) != NULL){
printf("%s\n",str);
fprintf(fp2,"%s\n",str);
}

fclose(fp);
fclose(fp2);
return 0;
}

####ここまで####

以下が出力されたテキストファイル(out.txt)です。

^A^Dc
^A^D^L<87>
^Y<98>X^?m?;^D&ordm;?^QI&egrave;&Ccedil;
^A^Dc
^A^D^L<87>
^Y<98>X^?m?;^D&ordm;?^QI0g

酷い文字化けを起こしてしまっています。
解決方法をご存知であれば教えて頂けないでしょうか。どうぞよろしくお願いします。

投稿日時 - 2008-11-05 15:48:04

QNo.4455579

困ってます

このQ&Aは役に立ちましたか?

3人が「このQ&Aが役に立った」と投票しています

回答(6)

ANo.6

>バイナリファイルをテキストファイルとして扱う良い方法があれば是非ご教示頂きたいです。

「テキストファイルとして扱う」とは、文字化けせずに「視認(出力)できる形」として・・アドバイス。

 ・1文字8ビットとしてコードは、-128 ~ 127 です。
 ・このうち、33 ~ 126 までのみが次に示すとおり、コードと文字に対応があります。

   http://e-words.jp/p/r-ascii.html

  残るコードは、文字に対応がありません(「文字」として出力できない:32 「空白」は可)。

(これを、文字化けせずに視認できるようにするには)
☆1コードを多文字、例えば「16進2桁」の「2文字分」で、00 ~ 20、7F ~ FF などのように出力します。

 なお、「16進2桁」で表現する場合、本来「1文字」で視認できるコードも「16進2桁2文字」にしないと区別ができません。
 よって、この方法でテキストファイルにすると、当然ファイル容量はバイナリファイルの2倍になります。

 No.3 さんが言われるバイナリエディタは、画面上で、「16進2桁のテキストファイルとして扱う」ことが可能です。

注:文字列変数は、unsigned char str[1024]; としましょう(コードは、0 ~ 255 )。

  出力は文字列一括でなく、1コードずつ、"%02X" で・・。
----------------------------------------------
>//一行ずつバイナリファイルをテキストファイルにして保存
>while((fgets(str,1024,fp)) != NULL){
>printf("%s\n",str);
>fprintf(fp2,"%s\n",str);

 バイナリファイル中にあるだろうコード 0 は、どうするのだろう?。

投稿日時 - 2008-11-05 18:28:06

ANo.5

バイナリデータを16進数の文字に変換して表示したいとかでしょうか
とりあえずfgetsは使えません

投稿日時 - 2008-11-05 17:00:17

ANo.4

やりたいことが良くわかりません

>//file.txtはバイナリファイルなのでバイナリモードで開く
は何が入ってるんでしょ?
そもそもバイナリファイルと言っているのは何かのデータ?
それをそのままムリムリ%sではきだしてるから化け化けなのでは?
(吹っ飛ばないだけマシ?)

投稿日時 - 2008-11-05 16:08:55

ANo.3

ただ単に、バイナリの文字列を読み書きしたいということであれば、
バイナリエディタを使えばいいと思います。
「バイナリエディタ」で検索すれば、
フリーソフトが出てくるのでそれを使えば簡単にできます。

投稿日時 - 2008-11-05 16:01:22

ANo.2

ファイルをオープンするときのモードに"t"は使えるんですか?

なお、読んだファイルを「何も加工せずに」そのまま書くだけなら、
ファイルを単にコピーしているのと同じです。

投稿日時 - 2008-11-05 15:59:39

ANo.1

ソースの間違いとか言う以前に、そもそも何を行いたいのでしょうか?
これがわからなければ、アドバイスのしようがありません。
「テキストファイル」も広義としては「バイナリーデータのファイル」ですから、バイナリーファイルといえます。
というか「バイナリー」と「テキスト」の認識が間違っているような……

投稿日時 - 2008-11-05 15:58:16