• ベストアンサー

初心者です。。

1,2,3,4,5,6,7と数字が縦に並んでいる「a.txt」と いうファイルの平均を計算した「a1.txt」という ファイルを出力するプログラムを作りたいです。 本当は、何個数字があるか分からない場合のものを 作りたいと思っているのですが、まずは数字は 7個の場合から作ってみようと思い、 以下のようなプログラムを組んでみました。 # include <stdio.h> # define M 6 int main(void) { int i; FILE *fp; double s[M]; double snew[M]; fp = fopen("a.txt","r"); if(fp == NULL) { puts( "MISS" ); return 1; } for(i=0;i<M+1;i++){ fscanf( fp, "%lf", &s[i] ); } snew[0]=(s[0]+s[1])/2; snew[M]=(s[M-1]+s[M])/2; for(i=1;i<M;i++){ snew[i]=(s[i-1]+s[i]+s[i+1])/3; } fp = fopen("a1.txt","w"); if(fp == NULL) { puts( "MISS" ); return 1; } for(i=0;i<M+1;i++){ fprintf(fp,"%lf\n",snew[i]); } fclose( fp ); return 0; } snew[0]とsnew[M]は端っこなので片一方だけの平均を とるようにしているのですが、なぜかうまく値が でてきてくれません。いろいろ原因を探ってみた のですがわかりません。 何かアドバイスがあればお願いします。 後、何個数字があるかわからない場合、 配列をあらかじめ確保できないのですが、 そのような場合はどうすればよいかも 教えてください。 すいませんが、よろしくお願いします。

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

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.5

書き直してみました。 #include <stdio.h> int main(void){ FILE *fpr,*fpw; unsigned c=0; double wk,v[3]={0,0,0}; if(NULL==(fpr = fopen("a.txt","r"))){ puts("READ MISS"); return 1; } if(NULL==(fpw=fopen("a1.txt","w"))){ puts("WRITE MISS"); return 1; } while(!feof(fpr)){ fscanf(fpr, "%lf\n", &wk); v[2]=v[1];v[1]=v[0];v[0]=wk; c++; if(c==2) fprintf(fpw,"%lf\n",(v[0]+v[1])/2.0); else if(c>2) fprintf(fpw,"%lf\n",(v[0]+v[1]+v[2])/3.0); } fprintf(fpw,"%lf\n",(v[0]+v[1])/2.0); fcloseall(); return 0; }

その他の回答 (4)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.4

すみません、#2は勘違いしていますね。 忘れて下さい。

回答No.3

もとのプログラムが思い通りに動作しないのは、 配列宣言が間違ってるからかと。 double s[M+1]; double snew[M+1]; で、どうですか? Cでは、s[6] と宣言した場合、 s[0] ~ s[5] の配列が利用可能です。

take_kazuo
質問者

お礼

ほんと初心者ですね・・。 実際ここが現レベルでは一番問題なのかと。 ありがとうございます!!

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

#include <stdio.h> int main(void){ unsigned c; FILE *fp; double v; double sum,ave; fp = fopen("a.txt","r"); if(fp == NULL){ puts( "READ MISS" ); return 1; } sum=c=0; while(!feof(fp)){ fscanf( fp, "%lf\n", &v); sum+=v; c++; } fclose(fp); fp = fopen("a1.txt","w"); if(fp == NULL){ puts( "WRITE MISS" ); return 1; } ave=sum/c; /* printf("%u,%lf\n",c,sum);*/ fprintf(fp,"%lf\n",ave); fclose(fp); return 0; }

  • katouka09
  • ベストアンサー率50% (130/256)
回答No.1

まず、2つのファイルを扱うのにファイルポインタが 1つだけしか用意されていないのが原因でしょう。 次に、読み込み用に使用しているファイルポインタで 新たにファイルを開こうとしているから当然 エラー処理を実行しています。 複数のファイルを扱うなら、同じ数分のファイルポインタ を用意する必要があります。 データの取り込み方法も間違っているようなので、入門書を熟読しましょう。

take_kazuo
質問者

お礼

ありがとうございました。 入門書を熟読している段階ですが、さらに 熟読を重ね精進します!

関連するQ&A

専門家に質問してみよう