Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

C言語 ファイル

解決したいこと

image.png
これを行いたいです。
data.csvは作りました。

該当するソースコード

#include

int main(){

FILE   *fp;
int   c,d;
double   a,b,x[100], y[100];

fp=fopen("data.csv","w");

if(fp== NULL){
printf( "ファイルがオープンできません。¥n" );
return(1);

}else{
printf("ファイルをオープンしました。\n");
}

for(int i=0; i<100; i++){
	c=c+x[i];
	d=d+y[i];
}

a=c/100;
b=d/100;


printf("xの平均は%f\n", a);
printf("yの平均は%f\n", b);

fclose(fp);
printf("ファイルをクローズしました。\n");

return(0);

}
こうゆう風に書いたのですが、
実行させたら、
image.png

こういうふうになってしまいます。
どうしたらいいですか?
お願いします。

0

3Answer

前提なんですが,今回はcsvのデータを読み込む課題なんですよね・・・?
なぜ書き込みモードで開いているんです…?1

“w” テキストファイルを書き込みモードでオープンする
既にファイルが存在する場合
ファイルのサイズを0にする

当たり前ですがデータをx,yに格納する処理も別途必要です.

  1. ついでに言うとエラーの原因は大方「別のアプリケーションに開かれているファイルを書き込みモードで開こうとした」です.Excelで開きっぱなしにしてたりするとそうなります.

1Like

Comments

  1. @TonyAven

    Questioner

    コンパイルして、実行できるようになったのですが、「当たり前ですがデータをx,yに格納する処理も別途必要です.」これはどういったことでしょうか?
    ファイルをオープンしました。
    xの平均は-19044232.000000
    yの平均は20036693.000000
    ファイルをクローズしました。
    こういうふうに表示されたのですが、ちがいますかね?
  2. その値はおそらく変数宣言時のゴミで計算した結果だと思われます.
    ご提示頂いたソースコードには「ファイルから内容を読み取る処理」がありません.
    x,yという配列を宣言したところで,自分でファイルから値を読み取らなければ無駄になるだけです.
    CSVからの読み取りであればfscanf_s関数があるので,上手く使ってみてください.
ファイルをオープンしました。
xの平均は-19044232.000000
yの平均は20036693.000000
ファイルをクローズしました。

という結果になったのは、C言語の変数初期化のルールです。
main関数の中に、double a, b, x[100], y[100]というローカル変数が宣言されていますが、初期化されていないので、予想不能の値になります。
グローバル変数なら自動初期化されます。

多分x[100]とy[100]にファイルからの値を用いて付与すると想定されていますが、ソースにそのような処理がなくて、単純に予想不能の値のままで計算され、結局上記の結果になります。

デバッグでもよいが、以下のようにxとyの出力を追加すれば確認できます。

    for (int i = 0; i < 100; i++) {
        c = c + x[i];
        d = d + y[i];
        printf("%d, %d\n", x[i], y[i]);  //この行を追加すれば計算されているxとyを確認できる
    }

また、もし宣言のところを以下のように初期化すれば、最後の結果は0になります。

double a=0, b=0, x[100]={0}, y[100]={0};

変数をできるだけ初期化してから使用しましょう。

0Like

Your answer might help someone💌