C言語による構造体の値渡しについて
以下プログラムを作成しました。
1.read_file関数によりファイルを読み込み。
2.avg_kokugo関数により、国語の平均点を出す。
という流れで組まれているのですが、
1.read_file関数実行時に、dat構造体を渡しています。
2.read_file関数内で、fscanfによる読み込みを行い、dat[i].name,&dat[i].kokugo,&dat[i].sansuに格納しているみたいに感じます。
ここで、疑問なのが、
「構造体を値渡しでdatをread_file関数に渡してる」と思っているのですが、
「read_file関数から、値渡しで渡された構造体datに、値を格納することはできるのでしょうか?」
本を参考にして勉強していたのですが、
「構造体は、値渡しの時に読み込みはできるが、更新はできない」
と書かれていたのです。(ポインタ参照渡しの時は可能。)
なぜ今回、read_file関数から、構造体datに値の格納ができるのでしょうか?
更新と新規格納は意味が異なるからなのでしょうか?
ご教授よろしくお願いします。
<ソース>
#include <stdio.h>
//グローバル
#define FNAME "test.txt"
struct score{
char name[20];
int kokugo;
int sansu;
};
int read_file(struct score dat[],int n);
float avg_kokugo(struct score dat[],int n);
int main(void){
struct score dat[3];
int ret;
float kokugo;
float sansu;
ret= read_file(dat,3);
if(ret <0){
return 0;
}
kokugo = avg_kokugo(dat,3);
printf("国語の平均 %.1f\n",kokugo);
return 0;
}
int read_file(struct score dat[],int n){
FILE *fp; //ファイルポインタ
int i;
fp=fopen(FNAME,"r");
if(fp==NULL){
printf("ファイルをオープンできませんでした。\n");
return -1; //-1によるプログラム強制終了
}
//データ読み込み
i=0;
//datに保存していく。
while((fscanf(fp,"%s%d%d",dat[i].name,&dat[i].kokugo,&dat[i].sansu)) != EOF){
i=i+1; //ファイル件数読み込み
}
fclose(fp);
return 0;
}
float avg_kokugo(struct score dat[],int n){
int sum; //合計
float answer;
int i;
sum=0;
for(i=0;i<n;i++){
sum = sum + dat[i].kokugo;
}
//平均点を求める
answer =(float)sum / (float)n;
return answer;
}