• ベストアンサー

Cでバイナリデータを変換

今持っているバイナリファイルfile1.x86をテキストファイルfile1.txtに変換したいんですけどうまくいきません。fopenとfreadでバイナリファイルを読み込むところまで入っていると思うんですけど、テキストファイルとして書き出すことができません。 #include <stdio.h> main() { short a[32000]; FILE *infile, *outfile; infile = fopen("iroha.x86", "r"); outfile = fopen("iroha.dat", "w+"); fread( a, sizeof(short), 32000, infile ); fwrite( a, sizeof(short), 32000, outfile ); fclose(infile); fclose(outfile); } これだとそのまんま出力されるんです。当たり前なんですけど... どこをどう変えればいいか教えてください。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • leaz024
  • ベストアンサー率75% (398/526)
回答No.4

No.1の補足より 「32000個の符号つき16ビットバイナリデータを32000個の10進数データとしてテキストファイルに書き込む」ということですよね。 #include <stdio.h> typedef short _s16bit; int main(void) {   FILE *fi, *fo;   int  i;   _s16bit sh_buf[32000];   fi = fopen("file1.x86", "rb");   fread(sh_buf, sizeof(_s16bit), 32000, fi);   fclose(fi);   fo = fopen("file1.txt", "w");   for (i = 0; i < 32000; i++) {     fprintf(fo, "%-6d%c", sh_buf[i], (i%10==9) ? '\n' : ' ');   }   fclose(fo);   return 0; } ○_s16bitは、お手持ちの環境に合わせ、符号つき16bitの型にtypedefしてください。(まだたいていの環境では大丈夫だと思いますが) ○エラーチェックは、ご自分の責任において組み込んでください。 ○ブラウザ上での見易さを考慮し、全角スペースをふんだんに(笑)使ってあります。行頭は全角SP2個でタブ1つに、シングルクォート内は半角SPに変換してからご利用ください。 注)脳内C/C++のコンパイル確認しかしておりません(笑)

collacolla
質問者

お礼

回答ありがとうございます。 そのまま実行したところ少しエラーが出ましたけど どうにかなりました。

その他の回答 (3)

  • nakashi
  • ベストアンサー率51% (21/41)
回答No.3

>今持っているバイナリファイルfile1.x86を >テキストファイルfile1.txtに変換したいんですけど >うまくいきません。 バイナリファイルfile1.x86の内容が解らないと... 1.ASCIIコード以外のバイナリデータが入っている時の処理方法をどうするのか 2.SJISの漢字コードが入っている時の処理方法をどうするのか main() { char sBuf[32000]; FILE *infile, *outfile; infile = fopen("iroha.x86", "rb"); outfile = fopen("iroha.dat", "w+"); fread( sBuf, sizeof(sBuf), 32000, infile ); for (int lLoop=0; lLoop<sizeof(sBuf); lLoop++) { fprintf(outfile,"%c",sBuf(lLoop)); } fclose(infile); fclose(outfile); } 動作未確認

collacolla
質問者

補足

回答ありがとうございます。 アドバイスいただいたプログラムは まだ試していないんですけど 僕の質問がよくなかったみたいなので 回答いただいた皆さんに補足させてもらってます。 失礼かもしれませんがbagyoさんの回答のところに 補足を書いておきました。 回答いただいた全員の方に同じ補足を書くのが いい事なのかわからなかったのでこういう補足 の仕方ですいません。 またアドバイスがあればよろしくお願いします。

  • kee
  • ベストアンサー率13% (63/457)
回答No.2

疑問の意図がわからないんですけど、 テキストの言葉のつかいかたが明確ではないんですね。 ASCIIで出力したいということか、 \nを付加して出力したいということか考えられるんです。 ちなみに、ASCCIで出力するのなら、bagyoさんの方法で、 %dに変えるんですけど、 文脈どおりに解釈する、とすると、 実際、textとbinneryとの違いというのは機会からは明確ではなくて、 使用者の使い方によるものなんです。 目に見える文字へすべて変換して、最後にラインフィード、改行を入力してあれば、 テキストであるといえます。 よって、#1の回答のとおりで、%dか%ldを使用してください。

collacolla
質問者

補足

回答ありがとうございます。 たしかにバイナリとテキストという言葉については ぜんぜん理解できていないので変な質問になってしまいました。 僕の回答が悪かったようなので補足させてください。 失礼かもしれませんがbagyoさんの回答のところに 補足を書いておきました。 回答いただいた全員の方に同じ補足を書くのが いい事なのかわからなかったのでこういう補足 の仕方ですいません。 またアドバイスがあればよろしくお願いします。

  • bagyo
  • ベストアンサー率40% (16/40)
回答No.1

こんにちわ。 コードを読んだ限りでは、複製をしているだけですね。テキストファイルへ変換したいということですが、それは例えば、バイナリエディタのように変換したいということでしょうか? そうでしたら、おそらく1文字ずつfprintfを利用して変換すればいいと思います。 fprintf(stdout,"%02x",data); などとやれば、dataが数値で10の場合は、aといった感じで出力されるはずです。(dataはunsigned char型)

collacolla
質問者

補足

回答ありがとうございました。 僕の質問が悪かったようなので補足させてください。 今持っているデータというのは 音声信号で0.64秒間のデータで32000個の符号つき16ビットの配列です。 で、これがバイナリデータということなんですが、 まずこの信号をプロットしたいというのが目的です。 C言語を使ってやりたいのですが、 まずテキストエディタ(秀丸を使ってます。)で見れて さらに10進数で表示された状態になれば Ngraphでプロットできると思って こんな質問をしたんです。 そもそもぜんぜん違う方法でプロットできるなら (プログラミング言語はCってことで) それでもいいです。 こういうことなので何かアドバイスあれば またよろしくお願いします。 度々すいません。

関連するQ&A