-PR-
解決済み

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

  • 困ってます
  • 質問No.76119
  • 閲覧数4437
  • ありがとう数6
  • 気になる数0
  • 回答数4
  • コメント数0

お礼率 65% (74/113)

今持っているバイナリファイル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);
}

これだとそのまんま出力されるんです。当たり前なんですけど...
どこをどう変えればいいか教えてください。
よろしくお願いします。
通報する
  • 回答数4
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

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

  • 回答No.4
レベル12

ベストアンサー率 75% (398/526)

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

お礼率 65% (74/113)

回答ありがとうございます。
そのまま実行したところ少しエラーが出ましたけど
どうにかなりました。
投稿日時 - 2001-05-16 23:54:53
-PR-
-PR-

その他の回答 (全3件)

  • 回答No.2
レベル11

ベストアンサー率 13% (63/457)

疑問の意図がわからないんですけど、
テキストの言葉のつかいかたが明確ではないんですね。
ASCIIで出力したいということか、
\nを付加して出力したいということか考えられるんです。

ちなみに、ASCCIで出力するのなら、bagyoさんの方法で、
%dに変えるんですけど、

文脈どおりに解釈する、とすると、
実際、textとbinneryとの違いというのは機会からは明確ではなくて、
使用者の使い方によるものなんです。

目に見える文字へすべて変換して、最後にラインフィード、改行を入力してあれば、
テキストであるといえます。

よって、#1の回答のとおりで、%dか%ldを使用してください。
補足コメント
collacolla

お礼率 65% (74/113)

回答ありがとうございます。
たしかにバイナリとテキストという言葉については
ぜんぜん理解できていないので変な質問になってしまいました。
僕の回答が悪かったようなので補足させてください。

失礼かもしれませんがbagyoさんの回答のところに
補足を書いておきました。

回答いただいた全員の方に同じ補足を書くのが
いい事なのかわからなかったのでこういう補足
の仕方ですいません。

またアドバイスがあればよろしくお願いします。
投稿日時 - 2001-05-15 19:12:02


  • 回答No.1
レベル8

ベストアンサー率 40% (16/40)

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

お礼率 65% (74/113)

回答ありがとうございました。
僕の質問が悪かったようなので補足させてください。

今持っているデータというのは
音声信号で0.64秒間のデータで32000個の符号つき16ビットの配列です。
で、これがバイナリデータということなんですが、
まずこの信号をプロットしたいというのが目的です。

C言語を使ってやりたいのですが、
まずテキストエディタ(秀丸を使ってます。)で見れて
さらに10進数で表示された状態になれば
Ngraphでプロットできると思って
こんな質問をしたんです。

そもそもぜんぜん違う方法でプロットできるなら
(プログラミング言語はCってことで)
それでもいいです。

こういうことなので何かアドバイスあれば
またよろしくお願いします。
度々すいません。
投稿日時 - 2001-05-15 19:10:32
  • 回答No.3
レベル8

ベストアンサー率 51% (21/41)

>今持っているバイナリファイル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

お礼率 65% (74/113)

回答ありがとうございます。

アドバイスいただいたプログラムは
まだ試していないんですけど
僕の質問がよくなかったみたいなので
回答いただいた皆さんに補足させてもらってます。

失礼かもしれませんがbagyoさんの回答のところに
補足を書いておきました。

回答いただいた全員の方に同じ補足を書くのが
いい事なのかわからなかったのでこういう補足
の仕方ですいません。

またアドバイスがあればよろしくお願いします。
投稿日時 - 2001-05-15 19:16:44
このQ&Aのテーマ
このQ&Aで解決しましたか?
AIエージェント「あい」

こんにちは。AIエージェントの「あい」です。
あなたの悩みに、OKWAVE 3,500万件のQ&Aを分析して最適な回答をご提案します。

関連するQ&A
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


専門家があなたの悩みに回答!

-PR-

ピックアップ

-PR-
ページ先頭へ