• ベストアンサー

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

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

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

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

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)

回答No.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); */ -----

skmsk19410
質問者

お礼

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

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.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 ); といった具合で書き出します

skmsk19410
質問者

お礼

回答有難うございました。 バイナリではありません。テキスト形式です。 バイナリで保存する場合、フォーマットという概念がないと思います。 もし多次元配列をバイナリで保存する場合、読み書きさえできればよいと思います。保存されている状態は問わない、ということですね。 これがどうなるか、調べて分からない場合はご質問させて頂きます。 取り急ぎ御礼まで。

関連するQ&A

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

    fortranでできるファイルへの配列の出力をJAVAでどのようにプログラムするか教えて頂きたいと思います。 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個並ぶという意味です。これと同じことをやるJAVAプログラムを教えて頂きたいのですが。私の手元にある本にはやり方が載っていません。 JAVAにはfortranのような数字のカラムを指定するようなフォーマットの調整などできるのでしょうか。よろしくお願いします。 この質問は、C言語について以前質問したものですQNo.3590702。 JAVAだったらどうなるだろうと思ってお尋ねしています。

    • ベストアンサー
    • Java
  • Delphiで配列をファイルに出力する方法

    Delphi(Pascal)について質問します。 fortranでできるファイルへの配列の出力をDelphiでどのようにプログラムするか教えて頂きたいと思います。 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個並ぶという意味です。これと同じことをやるDelphiプログラムを教えて頂きたいのですが。私の手元にある本にはやり方が載っていません。 Delphiにはfortranのような数字のカラムを指定するようなフォーマットの調整などできるのでしょうか。よろしくお願いします。 この質問は、C言語について以前質問したものですQNo.3590702。 Delphiではどうなるかと思って質問いたしました。

  • 配列のサイズが明示的でない計算について

    Fortranを例にとった場合、 行列A,Bの積Cを計算する場合、例えば以下のようなループで計算していました。(Fortran77) do i=1,10 do j=1,10 sum=0.0 do m=1,10 sum=sum+a(i,m)*b(m,j) enddo c(i,j)=sum enddo enddo それが今では、以下1行です。(Fortran95) c=matmul(a,b) 配列1つ1つの成分について計算する必要がないと言えそうです。Pythonなんかは全部こういう思想ですね。 プログラム言語はすべてこういう方向に進んでいるように思えます。 これがやや不安に思えるところがあります。配列のサイズを指定していないのでどこまで使って計算しているかわからないからです。 古い方(上段)では配列のサイズや上限を指定しているので、指定しているところより先がどうなっていてもとりあえず被害はありません。 しかし、サイズについてのケアがないと思いがけないような計算をしてくるんじゃないかと思うのですが。計算のバグ取のときここ大丈夫かな?となって疑心暗鬼ということにならないかと思うのですが。 配列の最大値なども関数1つと言う感じですが、どこまでの範囲での最大なの?と聞きたくなるわけですが。 いかがでしょうか。

  • fortran 配列受け渡し時の次元の一致

    fortran90、コンパイラはifortです。 普通メインプログラムとサブルーチン間での配列の受け渡しは、次元を揃えて渡すと思います。 とあるコード(以後コードA)を読んでいると、2次元配列を渡し、1次元配列で受け取っていました。 例 program test1 integer :: a(3,3) call testsub(a) end program subroutine testsub(b) integer :: b(9) end subroutine これが受け取り側でどう処理されているのかわからず、調べるために適当なテストコードを書きました。 a 123 456 789 ↓ b 123456789 になるとか 結果、コンパイルは通ったのですがサブルーチン側では全て0で置き換えられてしまいました。 コードAはpgiかなんかでコンパイルしていたようなのでコンパイラの違いでしょうか? よくわらなかったので質問させて頂きました。 質問をまとめますと、 (1)次元の異なる配列の受け渡しができるかどうか (2)その場合中身はどうなるか よろしくお願いします。 ---以下テストコード--- program testa implicit none integer :: a(3,3),i,j do i=1,3 do j=1,3 a(i,j)=j+(i-1)*3 enddo enddo do i=1,3 do j=1,3 write(6,*) a(i,j) enddo enddo call sub1(a) end program subroutine sub1(b) integer :: b(9),i do j=1,9 write(6,*) b(i),'sub' enddo end subroutine

  • csvファイルを読み込んで二次元配列に格納したい

    200×250のある数字と文字の入力されたcsvファイル(またはtxtファイル)を読み込んで2次元配列に格納したいのです。 色々調べるとカンマの処理が必要ということがわかりましたが、どのようにソースを書けばよいかわかりません。使用言語はC言語です。 また、実際にcsvファイルを読み込むようにプログラムを書いてみましたが、すべて-858993460となって表示されます。 プログラミング初心者で勉強中なため困っています。 回答よろしくお願いします。 #include <stdio.h> #include <stdlib.h> #define row 200 #define column 250 int main() { int i, j; int data[row][column]; FILE *fp; fp = fopen("sample.csv", "r"); if (fp == NULL){ printf("ファイルがありません\n"); return 1; } for (i = 0; i < row; i++){ for (j = 0; j < column; j++){ fscanf(fp, "%lf", &data[i][j]); } } for (i = 0; i<row; i++){ for (j = 0; j < column; j++){ printf("%3d ", data[i][j]); } printf("\n"); } fclose(fp); return 0; }

  • VBA 配列計算について 配列の入力に配列の使用

    配列に複数のセル値の合計値を設定したいと思っています。 求める合計値は複数あるため、出力も配列となります。 そこで下記のようにプログラムを考えたのですが、全て同じ値の配列として出力されてしまいます。 VBAではC言語のように配列の古い値に足していくことはできないのでしょうか? (sum()は0で初期化) (10個飛ばしのデータの合計値を算出) For i = 0 To 10 For j = 0 To 5 sum(i)= sum(i) + Worksheets(sheetname).Cells(10, 3).Offset(j * 10, 0).Value Next i Next j 出力配列例 全て同じ値になってしまいます・・・ 1.254 1.254 1.254 ・・・ 回避方法もしくはうまい計算方法などありませんでしょうか

  • 配列を使わずに、変数名を動的にループで回したい

    配列を使わずに、変数名を動的にループで回したい 大学の課題をやっている途中に思ったことなのですが……。 プログラム中に同じ型の変数p1,p2,p3があり、それぞれの変数にループで同じ処理を施したいと思っています。 しかし、「p(i)」や「("p" + i)」などと、変数どうしを別のものとして認識させようとしても、コンパイラから警告が出て上手くいきません。 配列を使えば、このような処理が出来ることはわかるのですが、使う変数名を指定されてしまっているために、今回は配列を使えません。 出来るか出来ないか、出来る場合は方法を知りたいです。 後、今回はC言語のプログラムで利用出来るかが自分にとっての問題なのですが、C言語以外のこのプログラミング言語なら出来る、とかの情報もこの機会に知りたいです。 お答え出来る範囲でいいので、もしよければ回答お願いします。

  • Fortranの並びによる出力の書式指定について

    Fortranなのですが、以下のような並びによる出力について考えます。 write(*,'( 5i2 )') (n,n=1,5) 出力結果は1 2 3 4 5 というだけのことで、2桁の整数を5個出力せよ、ということです。出力する前から5個の整数が来ることが分かっているということになります。 ところが個数が5じゃない場合、どのように書式指定すればいいでしょうか。出力する整数の個数がプログラムの実行結果によって変化する(つまり変数)ということです。よろしくお願いします。 Fortranのカテゴリがないようなので、C言語の専門家に聞くしかないと思い、こちらに上げてみました。Cだとすんなりできそうですが。

  • 【C言語を教えてください!】2次元配列について

    【C言語を教えてください!】2次元配列について 2次元配列を用いて、コンソール画面(ターミナル)の中央付近に*を表示させるプログラムを作りたいのですがさっぱり分かりません。 画面の大きさは半角で横80 縦25です。 25は奇数ですので40×12に表示したいと思います。 2重ループでなら出来たのですが配列でのやり方がわかりません。 #include<stdio.h> main() { int i,j; for(i=0;i<25;i++){ for(j=0;j<80;j++){ if(i==12&j==39){ putchar('*'); }else{ putchar(' '); } } } return 0; } 回答お願いします!

  • 配列とハッシュの配列の要素を比較してファイルに書き出したい

    配列Aとハッシュの配列Bがあり、配列の内容をファイルに書き出そうとしています。このとき、パターンマッチをして、Aにしかない場合はAのデータを、Bにしかない場合はBを、両方にある場合は、Aをファイルに出力しようとしています。 以下のようなループのまわし方をしようとして、試行錯誤しましたが、うまい方法を思いつくことができませんでした。 ご教授いただければうれしいです。 while (defined $A[$i]) {  my ($name, $pass);  $j=0;  while (($name, $pass) = each(%{$B[$j]})){    if ($A[$i] =~ /$name/) {    }    $j++;  } $i++; }

    • ベストアンサー
    • Perl

専門家に質問してみよう