みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

配列のファイル出力について

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のような数字のカラムを指定するようなフォーマットの調整などできるのでしょうか。よろしくお願いします。

投稿日時 - 2007-12-11 22:23:49

QNo.3590702

すぐに回答ほしいです

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

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];
でも問題ありません。
これもポリシーの問題です。

※ インデントは全角になってます。

投稿日時 - 2007-12-12 01:42:30

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.3

追記。
標準出力の場合は
---- 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); */
-----

投稿日時 - 2007-12-12 01:45:49

お礼

有難うございました。
CやC++言語は、OSそのものを作ったり、データベース、ゲーム、顧客管理、その他ソフトウェア作成など何でもできる言語だと思います。だから、一般解説書などは全目的に対応することが書いてあり、自分固有の目的に使う場合どうやるかあまり記述していないように思います。
この質問も、解説書を数冊くまなく調べて載っていないので質問させて頂きました。strcat, strcpy, sprintfなどのパーツは知っていましたが、自分の目的のためにどのように使うかわかっておりませんでした。
まだまだ道のりは遠いようです。とにかく、御礼申し上げます。

投稿日時 - 2007-12-13 12:19:00

ANo.1

データを出力するのはバイナリなんでしょうか?
それですと無理です

テキストで書き出すのであれば 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 );
といった具合で書き出します

投稿日時 - 2007-12-12 01:01:34

お礼

回答有難うございました。
バイナリではありません。テキスト形式です。
バイナリで保存する場合、フォーマットという概念がないと思います。

もし多次元配列をバイナリで保存する場合、読み書きさえできればよいと思います。保存されている状態は問わない、ということですね。
これがどうなるか、調べて分からない場合はご質問させて頂きます。
取り急ぎ御礼まで。

投稿日時 - 2007-12-13 12:24:07

あなたにオススメの質問