• ベストアンサー

ファイル内のレコードからソートを行うには?

氏名A 年齢A 性別X 出身J ・・・ 氏名B 年齢B 性別X 出身K ・・・ 氏名C 年齢C 性別Y 出身J ・・・  :  : というような内容のレコードファイルを読込み、 氏名順にソートを行いたいのですがどうすればいいでしょう? 構造体とかを使えばうまく行くのでしょうか? *氏名順になれば、さらに年齢や性別などをソートする必要はありません。 環境 WinXP / Borland C++

質問者が選んだベストアンサー

  • ベストアンサー
回答No.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)
回答No.3

「氏名順」とはどのような順番でしょうか?

chappy-007
質問者

補足

アルファベットで文字コード順です。 Fukuda, Abe, Koizumi, Mori, Obuchi のような名前があったら Abe, Fukuda, Koizumi, Mori, Obuchi となる感じです。

  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.2

その程度でしたら、わざわざ、プログラムを作る必要はありません。 コマンドプロンプトでsortコマンドを実行して下さい。 sort ソートしたいファイル名  とすると、結果が画面に表示されます。 sort ソートしたいファイル名 > 結果を格納したいファイル名 とすると 結果を格納したいファイル名 に結果が格納されます。

  • asuncion
  • ベストアンサー率33% (2127/6290)
回答No.1

入力ファイルの内容に見合う構造体を定義できますか? 入力ファイルの件数に見合う構造体の配列を定義できますか? 入力ファイルを1行読み、読んだ内容を構造体の配列にセットできますか? 仮に、入力ファイルの中身が氏名だけであるとして、 読んだ内容を氏名順にソートできますか?

関連するQ&A