• ベストアンサー

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

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

  • バイナリデータ作成したいのですが、fwriteの使用方法を教えてください。

    indataというhexで書かれたテキストファイルをバイナリデータに変換したく 以下のようなプログラムを作成しましたが、dataのサイズを大きくすると coreダンプしてしまいます。具体的には7M超くらいから。 入力ファイルサイズはほぼ無限にあり、出力バイナリファイルは20MByteは欲しいです。 どのように改造したら、大きなサイズのバイナリファイルが作成できるでしょうか? 初心者ながら、いろいろ調べてここまで作成したので、根本がおかしいかもしれません。 よろしくお願いいたします。 #include<stdio.h> int main(void) { FILE *FPi, *FPo; char data[5000000]; int getdt,x; FPi=fopen("indata","r"); if ( FPi == NULL ) {return 1;} FPo = fopen("res.bin","wb"); if ( FPo == NULL ) {return 1;} x=0; while (1) { if(fscanf(FPi,"%x" , &getdt) == EOF ) {break; } data[x]=getdt; x++; } fwrite(data, sizeof(data), 1, FPo); fclose(FPo); fclose(FPi); return 0; }

  • Cで出力したバイナリをPythonから読みたい

    C言語でバイナリファイルに出力した配列データを、Pythonで使えるように読み込みたいです。 具体的な状況は以下の通りです。 ①以下のCプログラムを実行してdata.binを作った ``` #include <stdio.h> #include <complex.h> int main(){ int N = 256; double complex a[N]; FILE *fp; for(int i=0; i<N; i++){ /* a[N]に値を代入 */ } fp = fopen("data.bin", "rb"); fwrite(a, sizeof(a), 1, fp); fclose(fp); return 0; } ``` ②Pythonからこのdata.binファイルにアクセスして複素数の配列を得たい、が良い方法がわからない という感じになります。 現状やりかたがわからないので、一旦Cでバイナリファイルをfreadで読み込んでからfprintf等で10進数表記のテキストデータとしてファイル出力して、それをPythonから普通に文字として読み込んでから数値に変換して処理しています。 一回中間ファイルが挟まるので処理が面倒です。Pythonから直接バイナリが読めれば便利かと思い質問させていただきました。

  • c++ 出力ファイル名

    c++ 初心者 です。fortran 77fortran 90でしたら幾分わかります。 c++ のプログラムで、for 文やwhile文の中に出力させる文章を置いて、出力されるファイル名をforやwhileの変数に関連ずけるには、どういったものを書けばよいでしょうか? たとえば、以下のようなプログラムを書いて実行すると、"test"という文が書かれた"1"というファイル名のファイルが出力されます。 / / / / / / / / / / / / / / / / / / / #include <iostream> #include <fstream> using namespace std; int main() { ofstream of; of.open("1", ios::app); of << "test" << endl; of.close(); return 0; } / / / / / / / / / / / / / / / / / / / 上のプログラムの中の出力ファイル名は"1"ですが、これをfor文等のループの中で"1"~"10"として10個のファイルを出力したいです。 以下のように書くと、"i"というファイルに"test"という文字が10個書き込まれます。 / / / / / / / / / / / / / / / / / / / #include <iostream> #include <fstream> using namespace std; int main() { int i; ofstream of;   for(i=0; i<=10; i++) {     of.open("i", ios::app);     of << "test" << endl;     of.close(); } return 0; } / / / / / / / / / / / / / / / / / / / 上のプログラムの中の"i"のクオーテーションマーク""をとって of.open(i, ios::app); のように書いたらエラーでコンパイルできません。また、 of.open((char*) i, ios::app); のように書くとコンパイルはできますが、ファイルができません。 ファイル名"1"に"test" ファイル名"2"に"test" ファイル名"3"に"test" ・ ・ ・ ファイル名"10に"test" という風に出力できればいいのですが... わかる方すみませんが、ご指導願います

  • バイナリファイルの読み込みについて

    java初心者です。 今バイナリファイルの読み込みを行っているのですがバイナリファイルのデータの値とプログラムで読み込んだ値が違っているので困っています。 バイナリファイルはASCIIテキストになっていてデータを見ることができ中身は -0.00012 -0.00009 -0.00009 -0.00012 -0.00009 -0.00009 -0.00009 -0.00012 ・・・・・・・(値が続くという意味です) となっています。 作ったプログラムは import java.io.*; class a { public static void main(String[] args) { try { FileInputStream in = new FileInputStream("file name"); int ch; while ((ch = in.read()) != -1) { System.out.println(ch); } in.close(); } catch (IOException e) { System.out.println(e); } } } で作って読み込んでみたのですが出力された値は 45 48 46 48 48 48 49 50 ・・・・・・ になってしまいます。 どのようにしたら値が等しくなるのでしょうか。教えてください。

    • ベストアンサー
    • Java
  • ファイルへの出力

    例えば、以下のようなプログラムがあります。 public class rei{ public static void main(String args[]){ for(int i=0;i<100;i++){ System.out.println(i); } } } ここで、iの値をエクセルファイルに出力することはできるのでしょうか?できれば具体的に教えてください。よろしくお願いします。

  • バイナリファイル(画像)のよみこみ

    レポートで1024×1024ピクセルの画像を、間引いて256×256の画像にしろというのが出されました。画像はrawファイルです。 それで、とりあえず画像を読み込んで、出力するプログラムを書いてみたんですが、コンパイルは出来るのに実行すると不正な処理とけいこくがでてきてしまいます。 ソースは #include<stdio.h> main() { unsigned char in[1024][1024],out[1024][1024]; FILE *fp; int i,j; fp=fopen("aaa.raw","rb"); fread(in,sizeof(unsigned char),1024*1024,fp); fclose(fp); for(i=0;i<1024;i++){ for(j=0;j<1024;j++) out[i][j]=in[i][j]; } fp=fopen("bbb.raw","wb"); fwrite(out,sizeof(unsigned char),1024*1024,fp); fclose(fp); } です。 どこがいけないのかアドバイスいただきたいです。よろしくお願いします。

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

    こんにちは。 バイナリファイルをテキストファイルのように読み込んだり、書き込んだりすることは可能でしょうか。バイナリファイルをテキストファイルとして扱う良い方法があれば是非ご教授頂きたいです。 以下は自分なりに考えたプログラムなのですが、すごく文字化けして出力されてしまいます。どこがいけないんでしょうか。 ####プログラム#### #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 酷い文字化けを起こしてしまっています。 解決方法をご存知であれば教えて頂けないでしょうか。どうぞよろしくお願いします。

  • C言語初心者です。ファイルの入出力とwhile文の練習で下のようなプロ

    C言語初心者です。ファイルの入出力とwhile文の練習で下のようなプログラムを書いていたのですが、 どうもwhile文のところで無限ループに陥っているようです。 feofで入力ファイルの終端をチェックしていると思うのですが、なぜwhile文が終わらないのか分かりません。初歩的な質問ですが、よろしくお願いします。 ちなみに入力ファイルはバイナリ形式の2次元データです。 =============================================== #include <stdio.h> int main(int argc, char **argv){ char *input; FILE *data; int num; input = argv[1]; data = fopen(input,"r"); if (data == NULL){ puts("file open error!!"); return 1; } while(!feof(data)){ num ++; printf("%d\n",num); } fclose(data); return 0; } ===========================================

  • ループ内でsyslog出力

    いつもお世話になっております。 標題についてご教授願えないでしょうか。 今までfwrite等でファイルに出力していた内容を SYSLOGにて出力する事となりました。 その際、これまでfor(i=0; ・・・)等のループ内で ファイル出力して、ループを抜けたらfclose()としていた処理で、 同様の処理が出来るが教えて頂きたいです。 纏めと、ループ内のfwriteをsyslogに変更 openlogとcloselogはループ外

    • ベストアンサー
    • PHP
  • for文を使わずバイナリファイルから目的のデータを読む方法

    バイナリファイルを読み込んで、目的のデータまでfor文を使っているのですが、もっと効率良く目的のデータを読むことはできないのでしょうか? for (int a=0 ; a < 36 ; a++) { bytedata = (byte)fi.read(); } よろしくお願いします。

    • ベストアンサー
    • Java