質問: int main(){ FILE *FP; double ave, data, sum1=0.0, sum2=0.0, stdbun;//stdbunは標準偏差 int count=0;//何個の実数が書かれているかを数える変数 FP=fopen("input.txt", "r"); do{ fscanf(FP, "%f", &data); sum1=sum1+data; sum2=sum2+data*data; count++; }while(count==NULL); fclose(FP); ave=sum1/(double)count-1; stdbun=ave*ave-2*ave*sum1/(double)(count-1)+sum2/(double)(count-1); printf("sum:%.2f", sum1); printf("times:%d", count-1);//書かれていた実数の個数 printf("ave:%.2f", ave); printf("stdbun:%.2f", stdbun); return 0; } ### 試したこと 課題に対してアプローチしたことを記載してください ### 補足情報(言語/FW/ツール等のバージョンなど) より詳細な情報
回答: こんにちは。 **※回答の前に** 1. ソースコードを貼るときはmarkdownを使って整形しましょう。 2. タグが「**C#**」になっています。正しくは「C」かと。 続けて回答ですが、 > > warning:comparison between pointer and integer > > > エラーメッセージと言うか警告としては「ポインターとintegerを比較しているのでおかしくね?」ですね。ファイルから`fscanf`を利用して行データを読み込んでいるのですから、fscanfの返り値が使えます。 scanf 返り値がEOFならファイル終端なので、これでループを抜けます。do ~ whileは少々不適切です。でないと、今の質問者様のコードでは、空の無効なデータを参照していることになります。 `fscanf`で正しく1項目読めたら1が返るので、そのときに `count++`します。 尚、`fscanf`での読み込むデータは`double` なので、書式指定は`"%f"`ではなく、`"%lf"`かと。 ファイルの`fopen`時のチェックなどを含めて修正してみた例が以下、です。 ``` #include int main(){ FILE *FP; double ave, data, sum1=0.0, sum2=0.0, stdbun;//stdbunは標準偏差 int count=0;//何個の実数が書かれているかを数える変数 FP=fopen("./input.txt", "r"); if (FP == NULL) { return 1; } int ret; for (;;) { /* double なので%lfを使う fscanf(FP, "%f", &data); */ ret = fscanf(FP, "%lf", &data); if (ret == EOF) { printf("End of file.\n"); break; } else if (ret == 1) { sum1=sum1+data; sum2=sum2+data*data; count++; } } fclose(FP); printf("count=%d\n", count); ave=sum1/(double)count-1; stdbun=ave*ave-2*ave*sum1/(double)(count-1)+sum2/(double)(count-1); printf("sum:%.2f", sum1); printf("times:%d", count-1);//書かれていた実数の個数 printf("ave:%.2f", ave); printf("stdbun:%.2f", stdbun); return 0; } ```