ページ 11

構造体にfscanf

Posted: 2016年10月23日(日) 22:21
by Ohagi

コード:

typedef struct
{
  char name[128];
  int  score[12];
  int abs[12];
  int exam[12];
} Student;

int read_data(char *fname, Student *std)
{
  FILE *fp;
  int i = 0;

  if ((fp = fopen(fname, "r")) == NULL) {
    printf(error:fileopen\n");
    return 1;
  } else {
    while (fscanf(fp, "%[^,],%d,%d,%d ", std[i].name, std[i].score, std[i].abs, std[i].exam) == 4) {
      i++;
    }
  }
  fclose(fp);
  return 0;
}


int main(void)
{
  char fname[FILENAME_MAX];
  Student student[100];

  printf("file name:=");
  scanf("%s", fname);
  read_data(fname, student);

  return 0;
}

-----result-----
name = std1
score = X
abs =
exam =
name = std2
score =
abs =
exam =
-----result-----

構造体Studentをポインタで関数に渡してcsv形式のデータを読み取らせたいのですが
構造体とポインタの関係が上手く理解出来てないのか上手く行きません。

fscanfの第三引数には変数のポインタを与える必要がありますよね。
std.nameはstdはポインタで、.nameも配列名なのでポインタですよね。これは上手く代入できています。
std.scoreはstdはポインタで、.scoreは普通のint型ですよね。ここが上手く行きません。
std.(&score)のように見慣れない形式で記述しても案の定コンパイラにエラーが吐かれます。

構造体のポインタと構造体メンバのポインタの関係もよくわかりません。
初歩的な質問ですが回答していただけると助かります。

Re: 構造体にfscanf

Posted: 2016年10月23日(日) 22:34
by box
kazuki2655 さんが書きました:

コード:

  int  score[12];
  int abs[12];
  int exam[12];
本当に配列でいいんですか?だとすると、
kazuki2655 さんが書きました:

コード:

    while (fscanf(fp, "%[^,],%d,%d,%d ", std[i].name, std[i].score, std[i].abs, std[i].exam) == 4) {
ここで、score, abs, exam
の何番目の要素に入れるかがわかりません。コンパイルエラーが出るのではないでしょうか。
kazuki2655 さんが書きました:

コード:

    printf(error:fileopen\n");
"
が足りないので、コンパイルエラーが出ます。
くだんの実行結果(今は想定外でしょうけど)がちゃんと出るコードを貼ってください。使っているデータを含めて。
コンパイルできないコードを提示して、「こんな実行結果が出ます」といわれましても、
いかんともしがたいです。

Re: 構造体にfscanf

Posted: 2016年10月23日(日) 22:55
by Ohagi
エラーで書き直している間にchar型からint型に変更して配列の方を書き換えるのを忘れていました。

普通のint型にしていくつかコードを試してみたら無事データを読み込めました。

お騒がせしてすみません。

回答ありがとうございました。

Re: 構造体にfscanf

Posted: 2016年10月23日(日) 22:56
by Ohagi
解決しました。