• ベストアンサー

複数のファイルからのデータの平均を求める

c言語でファイルの読み取りに関する処理を行うプログラムを作っています。具体的な内容としては、いくつかのテキストファイルに数値が記されていて、それを読み込んで読み込んだ枚数分で平均を求めてくれる物を作りたいと思っています。平均の計算自体は分るのですが、読み込んだ数値をどう扱うかで詰まっています。二次元配列の列ごとにそれぞれのテキストファイルからの数値を入れていって要素ごとで平均を取るような形にすれば良いかなとは思っているんですが、うまく行きません。どなたかアドバイスをください。よろしくお願いします。

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

  • ベストアンサー
回答No.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); }

ko-kichi
質問者

お礼

最近プログラミングを始めたので list = (int *)malloc(num_file * num_data); というところははじめて見ました。 これを勉強して試してみようと思います。 どうもいろいろと親切にありがとうございました。

その他の回答 (2)

回答No.2

読み込んだ数値を他の処理にも使用したいなら、 配列を使った方がいいと思います。 やりたい処理は、 「一つ目のファイルの1行目」「二つ目のファイルの1行目」……の平均を求め、 「一つ目のファイルの2行目」「二つ目のファイルの2行目」……の平均を求め、 「一つ目のファイルの3行目」……(以下略 ということですよね? それならば2次元の配列を使えばいいのではないでしょうか。 なぜ、それでもうまくいかないのか詳しく説明していただければ手助けできるかもしれませんが。

ko-kichi
質問者

補足

読み込んだデータをどうやって二次元配列に入れればいいかで悩んでいます。 読み込むファイル数もこちらで指定したいので、for文を用いて最初のファイルから順番に、指定されたファイルの個数分オープンし、そのつどデータを二次元配列の最初の行から埋めていく事をしたいと思っています。まずは配列の宣言ですが、要素の数も読み込むファイルの数を指定するときに変わるので、どのように宣言したらいいんでしょうか。また配列に代入していくときは、 n=0; while(fscanf(fp,"%d",&data[n][a])!=EOF){ n++; } という感じではダメなんでしょうか?data[][]は入れていく配列で、aは読み込むファイルの数です。

回答No.1

読み込んだ数値の合計とともに、読み込んだ枚数も記録して、 平均を求めればよいのではないでしょうか? わざわざ配列を使用する意図がわからないのですが。。。

ko-kichi
質問者

補足

すみません、説明不足でした。 読み込むそれぞれのファイルには 2 3 4 2 6 ・ ・ のようにいくつかの数が記されています。 求めたかった平均は、読み込んだファイルの各行ごとの平均です。そして各行ごとの平均を求めた後にもそれらに対して行いたい処理があったので、配列の中に入れておけば、それらの値を引っぱってきて使う際に便利かなと思って配列を使おうと思っていました。 やっぱり、配列を使うのは回り道なんでしょうか?

関連するQ&A

  • ファイルからデータを読み込み平均値を求めるプログラムについて

    ファイルからデータを読み込み平均値を求めるプログラムについて はじめまして、最近C言語を学習し始めたものです。 ファイルからのデータ読み込みについての質問です。 たとえば、テキストファイルとして以下のような名前とスコアが示してあるファイルがあります。 ************************* 佐藤 0.8 伊藤 0.9 西村 0 酒井 -2.5 佐藤 -0.1 ・・・  ・・・ ・・・  ・・・ 西村 0.3 ************************* (名前の繰り返しもあるファイルです) このようなファイルから読み込みを行って、 左の氏名ごとにスコアの平均値を求めるプログラムを作成したいと考えております。 実行例として「西村」の場合0と0.3の平均値である0.15を求めて表示させたいです。 ・プログラムの流れとして         テキストファイルを読み込む     ↓ (テキストファイルの最後になるまで、各文字列(氏名)ごとのスコアの平均値を求める) ◇文字列(氏名)=初めて出た文字列   ←(条件分岐) yes→文字列の出た回数=文字列の出た回数+1     文字列.スコア=スコア no→文字列の出た回数=文字列の出た回数+1    文字列.スコア=(文字列.スコア+スコア)/文字列の出た回数 終了すると結果をファイルに書き込む このような流れでプログラムを作りたいと考えているのですが、 特に条件分岐のところをどのようにプログラムで表現したらでしょうか? 回答よろしくお願いします。

  • Fortran99で複数ファイルの読み込み

    Fortran99で有限要素法の解析プログラムを作成しています。 要素番号と節点番号、各節点の座標を三次元の配列にまとめて格納したく、 複数のcsvファイルを相互に参照しながら配列に読み込みたいと思っていますが、 その方法が分かりません。 具体的には、一つ目のファイル(ex1.csv)の中身が、 1 1 2 10 11 20 21 30 31 2 2 3 11 12 21 22 31 32 3 3 4 12 13 22 23 32 33 ........ と配列になっており、1列目が要素番号、2~8列目が節点番号としています。 二つ目のファイル(ex2.csv)の中身が、 1 0 0 0 2 5 0 0 3 10 0 0 4 15 0 0 5 20 0 0 ..... となっており、1列目が節点番号、2~4列目がそれぞれ、x, y, z座標となっています。 一つ目のファイルは、 open(10, file = 'ex1.csv', status = 'old', action = 'read', position = 'rewind') do ELEM = 1, MAXELEM read(10, *) (ELEMDATA(ELEM, m, 1), m = 1, 8) enddo close(10) と書き、全ての要素と節点番号を三次元配列の一、二次元目に読み込みました。 次に、ex1.csvの節点番号(2~8列目)の番号を読み取り、その番号をex2.csvの1列目 から探し出して、配列の三次元目に格納したいと思っています。 宜しくお願い致します。

  • テキストデータの読み込みについて

    C言語のテキストデータの読み込みについてです。 C言語のプログラムについてです。 2444,1114,2807, 1984,2845,2086, 658.1,-1564.0,1239.7, -102.0,958.4,123.1, 12.7,6.0,82.7 2439,1110,2802, 1973,2865,2108, 658.8,-1563.7,1239.6, -102.0,957.1,121.9, 12.8,6.0,82.7 2441,1106,2806, 1967,2888,2124, 659.4,-1563.5,1239.5, -102.2,956.4,121.0, 12.8,6.1,82.8 2440,1109,2808, 1964,2896,2127, 660.0,-1563.3,1239.4, -102.7,956.2,120.7, 12.8,6.1,82.8 2441,1112,2807, 1981,2894,2120, 660.6,-1563.0,1239.4, -103.3,956.2,120.1, 12.8,6.1,82.8                                       ↑ 上の様なカンマとスペースで15個に区切られているtxtファイルがあるのですが、このtxtデータの10コ目と11コ目をを計算で使いたく、取り出したいと考えているのですがscanfを使いどのように取り出すことが出来るのか、また取り出したデータから数値を引くことを教えて頂きたいです。 つまり -102.0   958.4 -102.0   957.1 -102.2 と 956.4 -102.7   956.2 -103.3   956.2,             を取り出して計算に使いたいです。 そして1番上の数値だと、 -102.0と958.4 を読み込み、例えばそれぞれ100を引いた値を配列に入れたいです。 -102.0と958.4 → -202.0 と 858.4 のように取り出したいです。 教えて頂きたいです。お願いします。

  • 複数のファイルデータを新しく作るファイルに全てコピーして張り付ける

    (48行*4列)の数値が与えられた似たような31個のファイルを 一つのファイルにその行と列の形を崩さず新しくファイルを作りそこに 31個のファイルを縦に貼り付けていくVBAをかんがえているのですがわかりません。 どのような方法でプログラムを作ればよろしいでしょうか? 別にperl でもかまいません。

  • visual basic6.0でのテキストファイルからの読み込みについて。

    vb初心者です。 数値をテキストファイルに保存しています。その数値は、x方向に10個、y方向に3個、つまり10列3行の数値を保存しています。 そのデータを2次元配列 D(x,y)として読み込みたいのです。 for x=0 to 9, for y=0 to 2 と範囲を指定して、数値全部を読み込むときは、D(x,y)の値は正しく入っているのですが、 ある範囲だけを読み込みたいとき、たとえば for x=0 to 5, for y=0 to 1 としたとき、D(x,y)は別の数値が読み込まれてしまいます。 これは、テキストファイルの数値が配列になっていないということですよね?? どうすれば、テキストファイルの数値を2次元配列として読み込むことができるのでしょうか? 文章が解りにくくてごめんなさい!!よろしくお願いします! 

  • Visual C++を 用いたテキストファイル読み込み(応用)

    Microsoft Visual C++ 2008 Express Editionを使っています。 テキストファイルは 約5000行×6列の数値(のみ)になっております。(列間にスペースあり) いくつかある5000×6行テキストファイルの中から、ファイル名を入力することで任意のテキストファイルにアクセスし、さらに6列のデータをそれぞれ別の配列に格納するコンソールプログラムを考えていますが行き詰まっています。例えば、1列目を配列1、2列目を配列2、・・・といった具合です。 詳しい方、どうかよろしくお願いいたします。

  • C言語でファイルの入出力

    C言語についての質問です。 統計学のシュミレータを作っていまして 大量の数値データ(1000程度)のデータを入力する必要があるのですが scanfなどで入力要求するには、数に無理がありますので 外部テキストファイルからプログラムに読み込みたいのですが 方法が分かりません。 希望としては、まずテキストファイルに 1000個の数値データを入力しておいて (数値データのみをコンマとか改行で区切ったものをあらかじめ作成しておく) それを1000個の配列 int data[1000]に 順番にインポートできるようにしたいです。 データ数は1000個で固定、すべてint型でOKです。 数値として処理したいので 文字列としてインポートしてしまうのはダメです。 あくまでint型の数値として考えてください。 回答よろしくお願いします。

  • テキストファイルを配列に

    始めまして C言語にてテキストファイルの中身を読み込み一次元配列に代入するというシステムを作ろうとしているのですがわかりません テキストファイルの中身は 12 5312 72 7 444 53 7884 といった具合で100数行あり一行ごとに配列に入れたいです 勉強を始めたばっかりで本を見ても書いていなく困っています わかるかたご指導願えますか? よろしくお願いいたします

  • 《エクセル》 平均値の求め方

    いつもお世話になります。 列Aに分類、列Bに数値がある場合に、「列Aの重複する分類の平均値を求める。ただし、列Bの値がゼロや空白だった場合、それを計算から除外する」という配列数式を組みたいのですが、うまくいきません。 お手数ですが、宜しくお願い致します。

  • VBScriptでCSVファイルを読み出したい

    現在VBScriptでCSVファイルを1行ずつ読み取って、2次元配列に格納するプログラムを作成しています。 CSVファイルの中身は、サンプルで shop,price,sales 001,500,700 003,1200,90 024,,18 という並びになっています。 実データは300件くらいです。 1行目のヘッダーを読み飛ばし、2行目のデータから1行ずつ読取、","でsplitを用いてまず1次配列に格納しています。 1次元配列のarrLine(0)=001、(1)=500、(2)=700と入ったデータを 2次元配列arrshopに順次保存?したいのです。 ---------------------------------------------- dim strLine '1行ずつ読込んだデータを持つ dim ntLineNum '行数のカウント dim arrLine '","で区切った要素を持つ一次元配列 dim arrshop '一次元配列になった要素を2次元配列として格納 Do until .AtEndOfStream   strLine = .ReadLine   if 0<>strComp("",Trim(strLine)) then ntLineNum = intLineNum + 1   end if   arrLine = split(strLine , ",")   arrshop = Array(arrLines,i) i = i + 1 loop ----------------------------------------- msgbox arrshop(2)(0) と指定すると「003」出るようにしたいです。 Array関数が上手くないような気もします・・・。 どなたかご教授お願いします(>_<。)