- ベストアンサー
配列のファイル出力について
fortranでできるファイルへの配列の出力をC言語でどのようにプログラムするか教えて頂きたいと思います。 2次元配列a(i,j)の出力はfortranでは以下のようなプログラムになります。 open(10,.省略...) ファイルを指定して開く do j=1,ny ループj write(10,'(100f10.3)') (a(i,j),i=1,nx) ループi+書き出し enddo ループjの最後尾 close(10) ファイルを閉じる 100f10.3というのは小数点3桁の実数で10カラムで表現したものが100個並ぶという意味です。これと同じことをやるC言語プログラムを教えて頂きたいのですが。私の手元にある本にはやり方が載っていません。 C言語にはfortranのような数字のカラムを指定するようなフォーマットの調整などできるのでしょうか。よろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
fortranか・・・懐かしい^^ 実際に仕事で触ったこと無いけど。 全て正常であることが前提です。 Cはfortranと違って、添え字の開始は0です。 どうしても1からにしたい場合は a[NX][NY]の宣言はa[NX + 1][NY + 1]にし「添え字0は使用しない」としなければなりません。 また、NX, NYは定数でなければなりません。 #define NX 100 #define NY 100 ---- Sample char buf[10 + 1]; char outbuf[100 * 10 + 1]; FILE *fp; int i, j; fp = fopen(【ファイル名】, "w"); for (j = 0; j < NY; j ++) { strcpy(outbuf, ""); for (i = 0; i < NX; i ++) { sprintf(buf, "%10.3f", a[i][j]); strcat(outbuf, buf); } fprintf(fp, "%s\n", outbuf); } fclose(fp); ----- strcpy(outbuf, ""); は outbuf[0] = '\0'; でも同じ結果です。 ただのポリシーの問題です。 char buf[10 + 1]; の'+1'は'\0'と言う終端文字を意図する為の処置です。 char buf[11]; でも問題ありません。 これもポリシーの問題です。 ※ インデントは全角になってます。
その他の回答 (2)
- nuko_punch
- ベストアンサー率40% (10/25)
追記。 標準出力の場合は ---- Sample char buf[10 + 1]; char outbuf[100 * 10 + 1]; /* 削除:FILE *fp;*/ int i, j; /* 削除:fp = fopen(【ファイル名】, "w"); */ for (j = 0; j < NY; j ++) { strcpy(outbuf, ""); for (i = 0; i < NX; i ++) { sprintf(buf, "%10.3f", a[i][j]); strcat(outbuf, buf); } printf("%s\n", outbuf); /* 変更 */ } /* 削除:fclose(fp); */ -----
- redfox63
- ベストアンサー率71% (1325/1856)
データを出力するのはバイナリなんでしょうか? それですと無理です テキストで書き出すのであれば sprintf,strcat,fprintfといったラブイラリー関数で可能です char buf[11], lbuf[1100]; lbuf[0] = "\0"; for( int n=0; n < 10; n++ ) { sprintf( buf, "%10.3f", a[j][i] ); strcat( lbuf, buf ); } といった具合で lbufにデータを組み上げて fprintf( fp, "%s\n", lbuf ); といった具合で書き出します
お礼
回答有難うございました。 バイナリではありません。テキスト形式です。 バイナリで保存する場合、フォーマットという概念がないと思います。 もし多次元配列をバイナリで保存する場合、読み書きさえできればよいと思います。保存されている状態は問わない、ということですね。 これがどうなるか、調べて分からない場合はご質問させて頂きます。 取り急ぎ御礼まで。
お礼
有難うございました。 CやC++言語は、OSそのものを作ったり、データベース、ゲーム、顧客管理、その他ソフトウェア作成など何でもできる言語だと思います。だから、一般解説書などは全目的に対応することが書いてあり、自分固有の目的に使う場合どうやるかあまり記述していないように思います。 この質問も、解説書を数冊くまなく調べて載っていないので質問させて頂きました。strcat, strcpy, sprintfなどのパーツは知っていましたが、自分の目的のためにどのように使うかわかっておりませんでした。 まだまだ道のりは遠いようです。とにかく、御礼申し上げます。