- ベストアンサー
プログラミングで住所の長い順に並べて表示させる方法とは?
- プログラミングで住所の長い順に並べて表示させる方法を教えてください。
- プログラム内のファイルからデータを読み込み、住所の長さに基づいてソートして表示する方法を知りたいです。
- book1.txtというファイルには複数の名前、生年月日、住所が書かれています。それらの住所を長さの順で並べて表示するためのプログラムの作り方を教えてください。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
方法は2パターンあります。 1つ目は、ファイルの内容を行順に全て読み込んだうえで、住所の長い順でソートして出力する。 ⇒ ループが2回まわることになります。 ファイルの行数(最大)が決まっていないと、領域をallocしながら読み込むことになります。 ソートのロジックが必要です。 2つ目は、ファイルの内容を住所の長い順でソートして読み込み、出力する。 ⇒ 読み込み部分がプラットフォーム依存になります。 UNIX/Linuxなら分かりますが、Windowsは分からないのでアドバイスできません。 どちらが良いのか分からないので、1つ目は面倒なので置いといて、 2つ目(Linux用)はこんな感じです。 --------------------------------------------------------------------------- #include <stdio.h> #include <math.h> /* Book1.txtから住所の長さ、名前、誕生日、住所を取り出して、住所の長さの降順でソートするコマンド */ #define CMD "cat Book1.txt|awk -F' ' '{printf \"%03d %s %s %s\\n\",length($3),$1,$2,$3}'|sort -r" int main() { char line[100], name[100], birth[100], address[100]; FILE *in_file; /* 変数追加 */ char addlen[4]; /* fopenをpopenに変更 */ in_file = popen(CMD, "r"); if ( in_file == NULL ) { return 0; } while( fgets( line, 100, in_file ) != NULL ) { /* addlenは不要だがデータとしてあるためとりあえず取る */ sscanf( line, "%s %s %s %s", addlen, name, birth, address ); printf( "name=%s, birth=%s, address=%s\n", name, birth ,address ); } /* fcloseをpcloseに変更 */ pclose(in_file); return 0; }
その他の回答 (1)
- crossgate
- ベストアンサー率65% (78/119)
crossgateです。 1つ目バージョンです。 全角スペースでインデントしてるので、適当に変えてください。 ---------------------------------------------------------------------- #include <stdio.h> #include <stdlib.h> #include <math.h> /* データを入れておく構造体 */ typedef struct { char name[100]; char birth[100]; char address[100]; } sData; /* 何件ずつデータ格納エリアを確保するか */ #define ALLOCCNT 100 /* qsortの評価関数 */ static int FuncSort(const void *s1, const void *s2) { int len1, len2; /* 住所の長さを取得 */ len1 = strlen(((sData*)s1)->address); len2 = strlen(((sData*)s2)->address); if ( len1 == len2 ) { return 0; } else if ( len1 > len2 ) { return -1; } else { return 1; } } /* メイン関数 */ int main() { char line[100]; FILE *in_file; sData *data_area; int data_cnt; int loop_cnt; in_file = fopen("Book1.txt", "r"); if ( in_file == 0x00 ) { return 0; } /* 初期領域を確保 */ data_area = (sData*)calloc(ALLOCCNT, sizeof(sData)); if ( data_area == 0x00 ) { fclose(in_file); return 0; } data_cnt = 0; while( fgets( line, 100, in_file ) != 0x00 ) { /* データ数が上限に達したら領域を再確保 */ if (( 0 == (data_cnt % ALLOCCNT)) & ( data_cnt != 0 )) { data_area = (sData*)realloc(data_area, (sizeof(sData) * (data_cnt + ALLOCCNT))); if ( data_area == 0x00 ) { fclose(in_file); return 0; } /* 再確保した領域は念のため初期化 */ memset(&data_area[data_cnt], 0x00, (sizeof(sData) * ALLOCCNT)); } sscanf( line, "%s %s %s", data_area[data_cnt].name, data_area[data_cnt].birth, data_area[data_cnt].address ); data_cnt++; } /* 取り込んだデータをソート */ qsort(data_area, data_cnt, sizeof(sData), FuncSort); /* ソート順に出力 */ for ( loop_cnt = 0 ; loop_cnt < data_cnt ; loop_cnt++ ) { printf( "name=%s, birth=%s, address=%s\n", data_area[loop_cnt].name, data_area[loop_cnt].birth, data_area[loop_cnt].address ); } fclose(in_file); return 0; }