- ベストアンサー
ファイル内のレコードからソートを行うには?
氏名A 年齢A 性別X 出身J ・・・ 氏名B 年齢B 性別X 出身K ・・・ 氏名C 年齢C 性別Y 出身J ・・・ : : というような内容のレコードファイルを読込み、 氏名順にソートを行いたいのですがどうすればいいでしょう? 構造体とかを使えばうまく行くのでしょうか? *氏名順になれば、さらに年齢や性別などをソートする必要はありません。 環境 WinXP / Borland C++
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
氏名が先頭なので行単位でのソートでよいと思います。 構造体で1行分のデータを確保する箱を作って、1行ずつ読みながらデータを追加すればリストができます。 このとき、追加する場所を工夫すれば自動的に小さい順に並びます。 こんな感じ?(参考ですのでエラー処理など追加が必要です) #include <stdio.h> #include <stdlib.h> /* malloc,free */ #include <string.h> /* strcmp, strchr */ #define SIZE 256 /* 1行の最大文字数 */ /* リストの要素構造体 */ struct node { char rec[SIZE]; struct node *next; }; /* リストに要素を追加する */ void add_list(char *s, struct node *p) { struct node *q; /* 登録する場所を探す */ while(p->next!=NULL) { if (strcmp(s,p->rec)<0) break; p=p->next; } /* 領域を確保して要素を追加する */ if ((q=malloc(sizeof *q))==NULL) { printf("malloc error\n"); return; } *q=*p; strcpy(p->rec,s); p->next=q; } /* リストの中を表示する */ void prt_list(struct node *p) { while(p->next!=NULL) { printf("%s\n",p->rec); p=p->next; } } /* テスト用メイン */ int main(void) { struct node root={"",NULL}; FILE *fp; char buf[SIZE], *c; /* ファイルを開く */ if ((fp=fopen("test.txt","r"))==NULL) { printf("file open error\n"); return -1; } /* 1行ずつ読みながらリストに登録 */ while (fgets(buf,sizeof buf, fp)!=NULL) { if ((c=strchr(buf,'\n'))!=NULL) *c='\0'; /* 改行削除 */ add_list(buf, &root); } /* ファイルを閉じる */ fclose(fp); /* リストを表示 */ prt_list(&root); return 0; }
その他の回答 (3)
- Tacosan
- ベストアンサー率23% (3656/15482)
「氏名順」とはどのような順番でしょうか?
- tatsu99
- ベストアンサー率52% (391/751)
その程度でしたら、わざわざ、プログラムを作る必要はありません。 コマンドプロンプトでsortコマンドを実行して下さい。 sort ソートしたいファイル名 とすると、結果が画面に表示されます。 sort ソートしたいファイル名 > 結果を格納したいファイル名 とすると 結果を格納したいファイル名 に結果が格納されます。
- asuncion
- ベストアンサー率33% (2127/6290)
入力ファイルの内容に見合う構造体を定義できますか? 入力ファイルの件数に見合う構造体の配列を定義できますか? 入力ファイルを1行読み、読んだ内容を構造体の配列にセットできますか? 仮に、入力ファイルの中身が氏名だけであるとして、 読んだ内容を氏名順にソートできますか?
補足
アルファベットで文字コード順です。 Fukuda, Abe, Koizumi, Mori, Obuchi のような名前があったら Abe, Fukuda, Koizumi, Mori, Obuchi となる感じです。