- ベストアンサー
複数のファイルからのデータの平均を求める
c言語でファイルの読み取りに関する処理を行うプログラムを作っています。具体的な内容としては、いくつかのテキストファイルに数値が記されていて、それを読み込んで読み込んだ枚数分で平均を求めてくれる物を作りたいと思っています。平均の計算自体は分るのですが、読み込んだ数値をどう扱うかで詰まっています。二次元配列の列ごとにそれぞれのテキストファイルからの数値を入れていって要素ごとで平均を取るような形にすれば良いかなとは思っているんですが、うまく行きません。どなたかアドバイスをください。よろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
/* No1 とNo2に回答した者です。 ファイルの数と各ファイルに記述されている要素の数は、読み込む時に決定される(決定する)のですよね? それならば動的にメモリを割り当てればいいと思います。 要素の数があらかじめ分かっているのであれば,EOFを使用せず,単純なfoo文で記述すればいいのではないでしょうか? */ #include <stdio.h> int main() { int *list; int num_file, num_data; // ファイルの数入力 printf("input number of file:"); scanf("%d", &num_file); // 一つのファイルに書かれているデータ数入力 printf("input number of data:"); scanf("%d", &num_data); // ここで必要な数だけメモリを確保します list = (int *)malloc(num_file * num_data); ・ ・ ・ // ここでファイルから読み込む処理を行います。 ・ ・ ・ free(list); }
その他の回答 (2)
- winterofmeei
- ベストアンサー率22% (20/88)
読み込んだ数値を他の処理にも使用したいなら、 配列を使った方がいいと思います。 やりたい処理は、 「一つ目のファイルの1行目」「二つ目のファイルの1行目」……の平均を求め、 「一つ目のファイルの2行目」「二つ目のファイルの2行目」……の平均を求め、 「一つ目のファイルの3行目」……(以下略 ということですよね? それならば2次元の配列を使えばいいのではないでしょうか。 なぜ、それでもうまくいかないのか詳しく説明していただければ手助けできるかもしれませんが。
補足
読み込んだデータをどうやって二次元配列に入れればいいかで悩んでいます。 読み込むファイル数もこちらで指定したいので、for文を用いて最初のファイルから順番に、指定されたファイルの個数分オープンし、そのつどデータを二次元配列の最初の行から埋めていく事をしたいと思っています。まずは配列の宣言ですが、要素の数も読み込むファイルの数を指定するときに変わるので、どのように宣言したらいいんでしょうか。また配列に代入していくときは、 n=0; while(fscanf(fp,"%d",&data[n][a])!=EOF){ n++; } という感じではダメなんでしょうか?data[][]は入れていく配列で、aは読み込むファイルの数です。
- winterofmeei
- ベストアンサー率22% (20/88)
読み込んだ数値の合計とともに、読み込んだ枚数も記録して、 平均を求めればよいのではないでしょうか? わざわざ配列を使用する意図がわからないのですが。。。
補足
すみません、説明不足でした。 読み込むそれぞれのファイルには 2 3 4 2 6 ・ ・ のようにいくつかの数が記されています。 求めたかった平均は、読み込んだファイルの各行ごとの平均です。そして各行ごとの平均を求めた後にもそれらに対して行いたい処理があったので、配列の中に入れておけば、それらの値を引っぱってきて使う際に便利かなと思って配列を使おうと思っていました。 やっぱり、配列を使うのは回り道なんでしょうか?
お礼
最近プログラミングを始めたので list = (int *)malloc(num_file * num_data); というところははじめて見ました。 これを勉強して試してみようと思います。 どうもいろいろと親切にありがとうございました。