- 締切済み
ファイルの入出力
今までに大統領になった人の就任日、代、名前などデータがCSVファイルとしてあります。そのファイルをfgets関数で1行ずつ読み込み、大統領になった回数が多い順に並び替えて新しいcsvファイルに出力したいと考えています。 構造体にそのデータを入れていきたいと思うのですが、その構造体にデータを入れるにはどのようにしたら良いのでしょうか??またどのような構造体を作れば良いのでしょうか??win98でc言語を使用しています。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- yasuyuki007
- ベストアンサー率55% (16/29)
CSVファイルの内容(特に項目)が明確になっていないので質問にあるデータのみとなることをご了承下さい。 構造体の作り方について回答させて頂きます。 ずばり、以下のようにすると良いと思います。 変数名・型・サイズは例ですので、必要に応じて変更して下さるようにお願いします。 /* 構造体のタグを定義する */ struct PRESIDENT { char inauguration-date[9]; /* 就任日:yyyymmdd */ int generation; /* 代 */ char name[101]; /* 名前 */ int times; /* 回数 */ } ; struct PRESIDENT president[100]; /* 実体を確保 */ 構造体にデータを入れる方法について、以下に回答します。 尚、以下の説明で使用している変数はあらかじめ定義してあり、かつ適切なサイズである。また、入力ファイルは必ず存在するものとします。 /* 入力側のcsvファイルを開く */ fp = fopen("input-president.csv", r); /* カンマ(,)を探して、データを構造体に格納する */ memset(Buffer, '\0', sizeof(Buffer)); /* fgetsでファイル中のレコードを読み込む */ for (j = 0; j < 100 && fgets(Buffer, sizeof(Buffer)-1, fp) != NULL; j++) { char *stptr = &Buffer[0]; for (i = 0; i < sizeof(Buffer)-1; i++) { /* 就任日を探して、構造体に格納 */ if(Buffer[i] == ',') { Buffer[i] = '\0'; strcpy(president[j].inauguration-date, stptr); i++; break; } } stptr = &Buffer[i]; for ( ; i < sizeof(Buffer)-1; i++) { /* 代を探して、構造体に格納 */ if(Buffer[i] == ',') { Buffer[i] = '\0'; president[j].generation = atoi(stptr); i++; break; } } stptr = &Buffer[i]; for ( ; i < sizeof(Buffer)-1; i++) { /* 名前を探して、構造体に格納 */ if(Buffer[i] == ',') { Buffer[i] = '\0'; strcpy(president[j].name, stptr); i++; break; } } stptr = &Buffer[i]; /* 回数は最後の項目なので探す必要はない */ president[j].times = atoi(stptr); memset(Buffer, '\0', sizeof(Buffer)); } 以上で、ファイルからの入力は終了しました。 /* 入力ファイルをクローズする */ fclose(fp); fp = NULL; 以降の処理は、 構造体のデータをソートする ソートが終わったデータをファイルに出力する ですが、ご質問ではデータの入力までなので 割愛させて頂きます。 以上の回答を参考にして頂ければ幸いです。
- Tsukasa0215
- ベストアンサー率22% (280/1257)
fgets関数で取得したデータを各データに分ける。 分けたデータを構造体のメンバーに保存。 それをファイル全体に施しす。 構造体のデータをソート。 全構造体をファイルに書き出す。
- jppy
- ベストアンサー率14% (14/99)
とりあえず 「猫でも分かるプログラミング」の15章を読んだ方がいいと思います。 検索エンジンで調べればでてきます。