• ベストアンサー

ループ文出力から バイナリファイルの作成方法

for文でまわして求められた値をバイナリファイルに落としたく、下記のようなプログラムを書いたのですがうまくいきません。fwriteをretfunc中で行えばうまくいくと思うのですが、retfuncは実際は複雑なので、下位関数で計算だけを行い、mainでは戻り値を随時バイナリファイルに書き込むだけの処理にしたいです。 質問(1) 下記プログラムだとfor文がまわりません。勝手にループして欲しいだけなので引数はなくvoidとしてみましたが問題ないでしょうか? 質問(2)どうしたらループするでしょうか? 質問(3)fwriteの使い方はあってますか?サイズは1バイトで一個ずつの書き込みです。 ※参考書を元にやっているため体系的に理解してないことも多いです。 ご教授よろしくお願いします。 #include <stdio.h> #include <stdlib.h> int retfunc (void) { int acnt,bcnt; int srout; for ( bcnt=0; bcnt<10; bcnt++) { for ( acnt=0; acnt<10; acnt++) srout=いろいろな処理; return srout ; } } main (int argc, char *argv[]) { int srout; FILE *FPo; FPo = fopen("out.bmp","wb"); if ( FPo == NULL ) { puts("Can't open out.bmp!"); return 1; } srout =retfunc(); fwite(&srout,1,1,fpo); }

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

  • ベストアンサー
回答No.2

ループを抜ける原因は#1の方が回答しているので どう作れば良いか、を回答します。 まずループ分は呼び出し側に置きましょう。 for(){ for(){ srout = retfunc(); fwrite(); } } って事ですね。んでこの場合acntとbcntをどうするか、って問題があって、 (1)retfunc()に引数を持たせたくない場合 ・acnt,bcntをグローバルに置く ・retfunc()内でスタティック変数として扱う (2)retfunc()に引数を持たせても良い場合 ・acnt,cntを引数で渡しましょう んでfwrite()の使い方ですが、ずばり間違っています(動く事は動きますが、処理系によってはバグを招きます)。関数リファレンスをよく読んでください。第二引数は何と書いていましたか?

lts107
質問者

お礼

ありがとうございました。 >まずループ分は呼び出し側に置きましょう。 でだいぶ解決しました。 fwriteもsizeofで適切に処理することにしました。

その他の回答 (1)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

return srout ; が、forループの中にあったらbcntの方はまわらなくて当然です。

lts107
質問者

補足

早速のご回答ありがとうございます。 そうするとどうしたらよいでしょうか? ループの外に出すわけにもいかないですし・・・ 根本的に構成を変えなければならないでしょうか?

関連するQ&A