- ベストアンサー
テキストファイルの出力について
今、学校の課題でC言語を使ってプログラムを作っています。 20000個のデータを読み込んで、200個ずつに区切り、別々のテキストファイルで出力するというものです。 最初につくったのは、以下の通りです。 *********************************************** FILE *fp; { int b,i=0; data[0][i]=trend_data[0][i]; data[1][i]=trend_data[1][i]; fp = fopen("D1.txt","w"); for(i=0;i<=199;i++){ fprintf(fp,"%8.8f %8.8f\n",data[0][i],data[1][i]); } fclose(fp); fp = fopen("D2.txt","w"); for(i=200;i<=399;i++){ fprintf(fp,"%8.8f %8.8f\n",data[0][i],data[1][i]); } fclose(fp); ・・・ ***************************************** これだと20000まで繰り返し記述しなければならずかなり困難だと思いました。そこで、ループを作ろうとしたのですが、テキストファイルをループを使って複数作成する方法がわかりません。 以下のようなプログラムを作ったのですが、テキストファイルが一つしか作られませんでした。 どのように記述すればよいのでしょうか? **************************************** FILE *fp; { int a,i=0; int b=1; int c=199; data[0][i]=trend_data[0][i]; data[1][i]=trend_data[1][i]; start: fp = fopen("D[1+b].txt","w"); for(i=a;i<=c;i++){ fprintf(fp,"%8.8f %8.8f\n",data[0][i],data[1][i]); if(i > c) c = c+200; a = a+200; b++; goto start; fprintf(fp,"%8.8f %8.8f\n",data[0][i],data[1][i]); fclose(fp); } } ****************************************** よろしくお願い致します。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
こんなのでどうでしょうか。(ファイルへの書き出し部分のみ) FILE *fp; { int i,j; char fname[64]; for( i=0; i<100; i++ ) { sprintf( fname, "D[%d].txt", 1+i ); fp = fopen( fname,"w"); for(j=0; j<200; j++){ fprintf(fp,"%8.8f %8.8f\n",data[0][i*200+j],data[1][i*200+j]); } fclose(fp); } }
その他の回答 (3)
- Soli
- ベストアンサー率11% (7/61)
アルゴリズム的な話は解決しているので基本を。 基本的にダブルクォーテーション(")で囲まれているものは 文字列として扱われ、そこに変数名をそのまま書いても 文字列と認識され、変数とは認識されません。 ってその部分は多分凡ミスですよね。 失礼しました。
- -izayoi-
- ベストアンサー率45% (48/105)
全体的に、アドバイスしたい箇所がたくさんあるのですが..(^^; 要点(最低限の部分)だけ・・ (1)fopen("D[1+b].txt","w"); "D1","D2" … というように、別名のファイルが作られることを期待してるのだと思いますが、fopenに"D[1+b].txt"という文字列を与えているだけ(「b」を変数などと解釈してくれない)ので、何度ループしても"D[1+b].txt"というファイルしか作られません。 (2)「start:」~「goto start;」のループを抜ける条件(ステートメント)が無いですね。 このコード実行すると、無限ループすると思いますが.. 安易にgoto文を使うと、プログラムが難解になり、バグを作り込むもとになります。while文などでループを作り、終了条件を指定してください。 正解例のコードは、#1で回答されていますので、省きます。 蛇足かもしれませんが・・ 言語特有のテクニックは、習うより慣れろです。既存の良いプログラムをトレースしたり、自分でたくさんプログラムを書くことで上達します。 プログラミングは、言語特有のテクニック以上に、全体の構造を設計する能力が必要です。例えば、「処理の繰り返しが必要→ループ(while文等)」「条件がある→条件式(if文)」というように、ロジックを頭の中で整理して、シンプルに組み立てる能力が重要になってきます。 もしも将来、プログラマーなどを目指しているようであれば、ロジックを組み立てる能力を養いましょう。これを持っていれば、別の言語を扱う場合も役立ちます。 頑張ってください。
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
ファイル名を以下のような感じでやればいいです。 char filename[32]; sprintf(filename,"D%03d.txt",b); 質問文の プログラムは、 start:~goto start; で無限ループになります。 ループの中にfclose(fp);も入れてあげましょう
お礼
皆さんにお礼を書いたのですが、入力されていませんでした。初めて「教えて!goo」を使うもので申し訳ありませんでした。 回答してくださった皆様、本当にありがとうございました!非常に参考になり、また自分の知識が不足しているということにも気付きました! これからはどんどん自分でプログラムを作ってその中で多くのことを学んでいこうと思います!