構造体にfscanf

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Ohagi
記事: 31
登録日時: 3年前

構造体にfscanf

#1

投稿記事 by Ohagi » 2年前

コード:

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)のように見慣れない形式で記述しても案の定コンパイラにエラーが吐かれます。

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

box
記事: 1736
登録日時: 8年前

Re: 構造体にfscanf

#2

投稿記事 by box » 2年前

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");
"
が足りないので、コンパイルエラーが出ます。
くだんの実行結果(今は想定外でしょうけど)がちゃんと出るコードを貼ってください。使っているデータを含めて。
コンパイルできないコードを提示して、「こんな実行結果が出ます」といわれましても、
いかんともしがたいです。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

Ohagi
記事: 31
登録日時: 3年前

Re: 構造体にfscanf

#3

投稿記事 by Ohagi » 2年前

エラーで書き直している間にchar型からint型に変更して配列の方を書き換えるのを忘れていました。

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

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

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

Ohagi
記事: 31
登録日時: 3年前

Re: 構造体にfscanf

#4

投稿記事 by Ohagi » 2年前

解決しました。

閉鎖

“C言語何でも質問掲示板” へ戻る