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

これだとそのまんま出力されるんです。当たり前なんですけど...
どこをどう変えればいいか教えてください。
よろしくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (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++のコンパイル確認しかしておりません(笑)
    • good
    • 0
この回答へのお礼

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

お礼日時:2001/05/16 23:54

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

この回答への補足

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

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

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

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

またアドバイスがあればよろしくお願いします。

補足日時:2001/05/15 19:16
    • good
    • 0

疑問の意図がわからないんですけど、


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

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

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

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

よって、#1の回答のとおりで、%dか%ldを使用してください。

この回答への補足

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

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

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

またアドバイスがあればよろしくお願いします。

補足日時:2001/05/15 19:12
    • good
    • 0

こんにちわ。


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

この回答への補足

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

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

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

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

こういうことなので何かアドバイスあれば
またよろしくお願いします。
度々すいません。

補足日時:2001/05/15 19:10
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q地熱発電などでいう「バイナリ発電」とは

地熱発電などの文献で「バイナリ発電」という言葉がでてきますが、この意味をお教えください。
そもそも、バイナリ発電という場合の「バイナリ」とは、どういう意味で使用されているのでしょうか。

Aベストアンサー

bi---2と言う意味。バイナリ(二進法)、バイリンガル(二ヶ国語)、バイカラー(二色)、バイセクシャル
 水では気体にならないため、より沸点の低い物質を使って蒸気を得るもの。熱交換器が二つ(バイ)ある。

Qsizeof(long), sizeof(short)   (処理系依存と言うけれど・・・)

 
数値(整数)型の定義サイズについて、質問です。

ANSIの規格では、

sizeof(short) ≦ sizeof(int) ≦ sizeof(long)

としか定義されていないので、実際にこれらの型が取る大きさは処理系依存だ、と聞きます。
しかし、VC++、BCCなど、知名度の高いコンパイラでは、いずれも、

sizeof(short) → 2
sizeof(int) → 2
sizeof(long) → 4

となっているようです。(手元にないので、gccでは確認していませんが・・・)
実際のところ、上記のサイズにならない処理系は実在するのでしょうか?

何故こんな質問をするのかというと、あるテキスト(事情があって、書名等の情報は出せないのですが)に

> 次の sizeof 演算子の返す値として正しいものはどれですか。
>
> long hoge[32];
> sizeof(hoge);
> ------------------------------------------------------
> A. 32
> B. 64
> C. 128
> D. 256
> E. 512

という問題が掲載されており、解説が、

> 正解は C 。
>
> long 型は 4 バイトで構成されるので、32 個の要素がある配列では、 128 バイトになります。

となっていたのです。(short型のサイズを問う類題あり)
特定の処理系が前提条件とされていないので、適切な設問、解説とは思えないのですが、誤りと断言できるほどの自信がないため、作者に指摘すべきか否か、迷っています。
sizeof(short) → 2、sizeof(long) → 4 にならない処理系が実在しなければ、規格の定義上は正しくなくても、実務上は誤りとは言えないような気もしますが、どうでしょうか?
コメントをお待ちしております。
 

 
数値(整数)型の定義サイズについて、質問です。

ANSIの規格では、

sizeof(short) ≦ sizeof(int) ≦ sizeof(long)

としか定義されていないので、実際にこれらの型が取る大きさは処理系依存だ、と聞きます。
しかし、VC++、BCCなど、知名度の高いコンパイラでは、いずれも、

sizeof(short) → 2
sizeof(int) → 2
sizeof(long) → 4

となっているようです。(手元にないので、gccでは確認していませんが・・・)
実際のところ、上記のサイズにならない処理系は実在するのでしょうか?

何故...続きを読む

Aベストアンサー

64ビットマシン向けの商用UNIXのほとんどでは、
sizeof(long)は 8
となっているはずです。(LP64モデルを採用)

ちなみに、
Win64では 4 のままです。(LLP64モデルを採用)

さらに重箱の隅をつつくようで申し訳ないですが、IA32向けのVC++や、BCCでは、sizeof(int)は 2 ではなく 4 を返しますね。ご確認を。

参考まで。

Qアプリのバイナリについて バイナリするにはどうすればよいですか?方法を教えて下さい。

アプリのバイナリについて

バイナリするにはどうすればよいですか?方法を教えて下さい。

Aベストアンサー

バイナリするってなんですか?
バイナリファイルを開きたい?
バイナリファイルの場所を知りたい?

よくわかりません

Qfp = fopen(argv[1], "r");を”w" "a" "r+"・・・で試したらどうなる

http://oshiete.goo.ne.jp/qa/8897349.html
 以上のプログラムで
 以下をfp = fopen(argv[1], "r");の
 ”r"以外で以下を入れた場合の結果がどうなるかお聞きしたいです。
"r" 読み込みモード。ファイルが存在しているとする。
"w" 書き出しモード。すでにファイルがあれば内容を削除し、なければ新たに作成する。
"a" 追加モード。すでにファイルがあればその最後に追加し、なければ新たに作成する。
"r+" 更新モード。ファイルが存在しているとする。
"w+" 更新モード。すでにファイルがあれば内容を削除し、なければ新たに作成する。
"a+" 追加更新モード。すでにファイルがあればその最後に追加し、なければ新たに作成する。
 以上ですが、試す環境がございませんので、よろしくお願いいたします。

Aベストアンサー

お書きのとおりで合ってますよ。大丈夫です。

Q[SQLサーバ&勘定奉行]バイナリ順にしてください!?

こんにちわ。

さて・・・。
SQLサーバがインストールされているPCに勘定奉行を入れようとしました。
勘定奉行はSQLを使うのですが・・・。

エラーメッセージで
「SQLサーバがバイナリ順でないためできません」
「バイナリ順に設定してください」
となります。

SQLサーバ7.0のどこをどうすれば「バイナリ順」に設定変更できますか??

Aベストアンサー

バイナリ順に設定しろというのは、やはりとりあえずSQLサーバのBooksOnlineで「並べ替え順」を検索・参照してみて下さい。この事だと思うのですが...。

Qfp = fopen(argy[1], "r");の[1]の意味は

https://oshiete.goo.ne.jp/qa/8940272.html
 の11行目に
fp = fopen(argv[1], "r");の[1]の意味が分かりません。
試したいのですが、ソフトがうまく動きません
 よろしくお願いいたします。

Aベストアンサー

前の例題も読みました。

大分苦戦しているようですが、配列については理解が進みましたでしょうか?
お答えしますと、最初のパラメータ文字列が代入されています。

古いC言語の約束でして大変有名なものです。

コマンドラインコンソールから実行ファイル名を書いて、
パラメータをスペースで区切って指定したとします。

このパラメータ文字列が[1]以降に入ります。
例として、"test"と言う名前の実行ファイルがあったとします。

例)> test test1 test2 3 4

このようにコマンドラインから入力し実行すると、

argc = 5
argv[0] = "test"
argv[1] = "test1"
argv[2] = "test2"
argv[3] = "3"
argv[4] = "4"

と文字列が入ってきます。

以下はサンプル。

void main( int argc , char *argv[])
{
if( argc < 2 )
{
// パラメータ指定がなかった場合の表示
printf( "test に続けて4つまでパラメータを入力できます\n");
exit(0);
}
if( argc > 5 )
{
 // パラメータが5つ以上あった場合の表示
printf( "5つ以上のパラメータは受け付けません\n");
exit(-1);
}

// 正常ルート
printf( "パラメータの数は%d個ですね?ニヤッ\n", argc-1);
printf( "最初のパラメータは%sでしょ?\n", argv[1]);
printf( "残りはargv[2]以降ですが、面倒なので表示しません\n");
}

と言う具合に、引数を活用できます。argv[0]には、実行ファイル名が入ります。
argc は実行ファイルの名前も含めてカウントされます。

プログラムによっては必要な引数の数が変わりますし、
ユーザーのコマンドラインからの入力ミスなどでパラメータがなかったり、
必要なパラメータが不足していたりしますので、
argcとargvを使って最初にシンタックスエラーチェックをするのが常道です。

実行ファイル名の指定がなく、プログラムが実行されることはないと思われます
から、argcは1以上の値になります。

argc, argvの活用は、
実行コマンドを手打ちで打ち込むコンソール形式でよく用いられる基本的な
アプリケーションの開発手法です。

ご質問の箇所は、
第一パラメータにプログラム内で読み込むファイルのファイル名を指定してるの
でしょう。(よくあります)

しかし、Windowsなどのウィンドウを使用するアプリケーションは、
これとは違っておりますので注意が必要です。
(C言語とは別に、Windowsに特化した開発ノウハウの勉強が必要です)

Windows系で上記の様な基本的なプログラムを作成する場合は、
プロジェクトの作成時に(VisualStudioなどで)コンソールアプリケーション
を選んで作成します。実行時にコンソールが開きます。

Linuxの場合は、コンソールがデフォルトになっているでしょうから、
(特殊な設定がなければ)そのまま作成できます。

テキストエディタでソースを記述し、gcc などでコンパイルします。
実行形式ファイルが出来ていれば、想定どおりの動作をするでしょう。

ファイルの読み込みが出来るようになったら、
ファイルの内容を書き換えて保存したり、
ファイル名を変えたり、
ディレクトリ内のファイルを全て表示したり、
ファイル内に含まれる文字列を検索し、該当するファイルをリストしたりなど、

有用なサンプルプログラムを沢山作って練習します。

ファイルを読み込む先は、char型の配列でバイトサイズのメモリーとして確保
します。メモリーと変数の関係を充分に理解することをお勧めします。
殆どのプログラムは、このメモリーの確保やメモリーサイズの計算と格闘する
場合が多くなるからです。

バイナリー形式のファイル(すべてはバイナリー形式として良いのですが)に
ついて理解が深まった後は、
bmpの画像ファイル、wavなどの音声ファイルをあけて、
これの中身を書き換えて遊びます。

特にwavファイルは、音量の変更や周波数フィルタなども掛けれますので、
メモリ、配列、ファイルの関係を(焦らずに)ゆっくり理解するだけで、
今の知識レベルでも面白いことが沢山出来ます。

以上、ご参考に成れば。

前の例題も読みました。

大分苦戦しているようですが、配列については理解が進みましたでしょうか?
お答えしますと、最初のパラメータ文字列が代入されています。

古いC言語の約束でして大変有名なものです。

コマンドラインコンソールから実行ファイル名を書いて、
パラメータをスペースで区切って指定したとします。

このパラメータ文字列が[1]以降に入ります。
例として、"test"と言う名前の実行ファイルがあったとします。

例)> test test1 test2 3 4

このようにコマンドラインから...続きを読む

Qcgiで表示するhtmlページ内でバイナリ画像を出力したい

cgiで表示するhtmlページ内でバイナリ画像を出力したい

「CGI 画像出力」でググったページで下記のコードがありました。
下記コードは、
Content-typeをimage/gif等にして バイナリを print すれば表示される
という書き方になっていると思いますが、
content-typeがtext/html のページ内でバイナリをprintした場合
バイナリが文字列としてグシャァァァと表示されてしまいます。


-------
$view = 'aaa.jpg';

print "Content-type: image/jpeg\n\n"; #コンテンツタイプを指定する
open IMGG,"$view"; #ファイルハンドル IMGGに画像ファイルを読み込む
binmode (IMGG); #画像なのでバイナリモードに設定する
print <IMGG>; #ファイルハンドルを画面に書き出す
close (IMGG); #ファイルハンドルを閉じる

exit;
-------

content-typeがtext/htmlの状態でバイナリの画像を表示するには
どうすればよいのでしょうか?

cgiを2つ用意して、上記のコードを img src=~~.cgi という形で
呼び出すしかないのでしょうか?

cgiで表示するhtmlページ内でバイナリ画像を出力したい

「CGI 画像出力」でググったページで下記のコードがありました。
下記コードは、
Content-typeをimage/gif等にして バイナリを print すれば表示される
という書き方になっていると思いますが、
content-typeがtext/html のページ内でバイナリをprintした場合
バイナリが文字列としてグシャァァァと表示されてしまいます。


-------
$view = 'aaa.jpg';

print "Content-type: image/jpeg\n\n"; #コンテンツタイプを指定する
open IMGG,"$view"; #ファイル...続きを読む

Aベストアンサー

基本的には、1リクエスト1ファイル返却となりますので、HTMLとJPEGは別々のファイルで返して下さい。

ヘッダー以降に返却されるデータはボディーであり、HTMLの途中からJPEGに変更するってのは反則で通りません。
HTMLの中で単純にバイナリを展開したら無茶苦茶な状態になります。
どうしてもと言うならバイナリをJSコードにして埋めてDOMで再生成とか無茶なやり方は思いつきますが…勧めません。

Qvoid (*signal(int signum, void (*handler)(int)))(int);

の解釈を教えてください
最後の「(int)」については詳しくお願いします

Aベストアンサー

signalが

(1)1つ目の引数の型:int
(2)2つ目の引数の型:引数がintで戻り値がvoidである関数へのポインタ
(3)戻り値の型:引数がintで戻り値がvoidである関数へのポインタ(2と同じ)

を満たす関数である事を宣言しています。最後の(int)はsignalの戻り値の
関数ポインタがint型の引数を持つ事を示しています。

「引数がintで戻り値がvoidである関数へのポインタ」の型をHANDLERと表すと

HANDLER signal(int signum, HANDLER handler);

となります。

QPHPのfopenのバイナリモードについて

PHPのfopen時のバイナリモードについて質問です。

PHPのマニュアルにはWINDOWSのようなバイナリとテキストモードの形式の違う
システムでは、画像等のバイナリファイルを扱うときはbを付けてバイナリモードで扱うことが推奨されていますが、
WINDOWS環境でためしたところ、画像ファイルをバイナリではなくテキストモードで開いて中身のデータを読み込んで、別名でfopen("~.jpg","w")で書き込んでも、きちんと表示される画像が作成されました。

テキストモードでバイナリファイルを開いても読み込めってさらに、新規でかきこめるなら
なぜ二つのモードが存在するのでしょうか?

ちなみに、WINDOWSにおけるバイナリとテキストモードの違いって改行文字が
¥nか¥r¥nの違いだけでしょうか?
リナックスではバイナリもテキストも中身の改行文字は¥nとなるのでしょうか?

よろしくお願いします。

Aベストアンサー

Windows以外のOSでは、バイナリモードというのはなく、"wb" "rb" も "w" "r" も同じ動作です。Windowsとのソース互換性のため、"b" をつけてもエラーになりません。

Windowsのバイナリモードはそのままファイルを読み込む/書き込む。テキストモードは、"\r\n" を "\n" に変換しながら読み込み、"\n" を "\r\n" に変換しながら書き込む。

QProgram Files(x86) と Program Files の切替

諸事情により、Windows Vista 64bitとXP 32bit上で32bitアプリケーションを開発しています。
開発環境はVisualStudio2005(これも諸事情…)でC++ + MFCです。

Program Files以下のDLL(32bit)をヘッダファイルでimportしているのですが、
32bit OSの人は"Program Files"からで
64bit OSの人は"Program Files(x86)"からと
1つのソースコード中で#defineなどで自動的に切り替える方法はあるでしょうか?
※ヘッダファイルでimportの方針も諸事情で変更できません。

現在、自分の環境に合わせてコメントアウトでごまかしていますが、
ソースコードをVSSで管理しているので、うっかり最新版に更新して
ビルドすると、エラーがぞろぞろ出て要らぬ工数がかかっています。

よろしくお願いいたします。

Aベストアンサー

「環境変数をマクロに取り込む」と言う手があります。

プロジェクトのコンパイラ指令に「マクロを定義するスイッチ」がある筈です。

そこに、環境変数を展開するように記述すれば、うまく行くでしょう。

例えば、マクロ定義スイッチが
-D マクロ名=定義内容
なのであれば
-D PROGRAM_FILES_X86=%PROGRAMFILESX86%
と指示しておいて、環境変数PROGRAMFILESX86に「0」か「1」をセットしておきます。

あとは、ヘッダファイルで
#ifdef PROGRAM_FILES_X86
#if PROGRAM_FILES_X86 == 1
#import <c:/Program Files(x86)/hogehoge.dll>
#else
#import <c:/Program Files/hogehoge.dll>
#endif
#else
#import <c:/Program Files/hogehoge.dll>
#endif
と書いておく。

これで、環境変数PROGRAMFILESX86に「1」と定義しておけば
Program Files(x86)
が使われるし、環境変数PROGRAMFILESX86に「1以外」を定義しておくか、コンパイラ指令にマクロ定義をしていないなら
Program Files
が使われる。

「環境変数をマクロに取り込む」と言う手があります。

プロジェクトのコンパイラ指令に「マクロを定義するスイッチ」がある筈です。

そこに、環境変数を展開するように記述すれば、うまく行くでしょう。

例えば、マクロ定義スイッチが
-D マクロ名=定義内容
なのであれば
-D PROGRAM_FILES_X86=%PROGRAMFILESX86%
と指示しておいて、環境変数PROGRAMFILESX86に「0」か「1」をセットしておきます。

あとは、ヘッダファイルで
#ifdef PROGRAM_FILES_X86
#if PROGRAM_FILES_X86 == 1
#import <c:/...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング