前提・実現したいこと
Atomエディタ
ターミナル
txtファイルに書かれている都道府県とその人口数のデータを所得し多い順に並び替えたい
発生している問題・エラーメッセージ
while ( fscanf(fpR, "%s%d", pft[i].name, &pft[i].population) != EOF ) {
printf( "【読込】『%s』の人口は%10d\n", pft[i].name, pft[i].population );
i++;
}
この部分が想定通りに起動せずに、ファイル内のデータを全て読み込んでも動作を終了しない。
プログラム全体
#include <stdio.h>
#include <stdlib.h> // exit() を用いるため
typedef struct city { // 構造体の宣言
char name[10]; // 都道府県名
int population; // 人口
} City;
void quicksort(City *a, int n);
int main(void) {
FILE *fpR, *fpW;// 構造体 FILE 型のファイルポインタの宣言
// fpR:読み込み用, fpW:書き込み用
City pft[50]; //struct City型の配列prefectureの宣言
City *ptr; //struct City型のポインタ変数の宣言
int pft_num; //読み込んだ都道府県の数
int i;
puts("『都道府県別の人口をファイルから読み込み、"); puts("人口数によって昇順に並び替えを行うプログラム』\n"); //読み込みファイルのオープン if ((fpR = fopen("pop2000.txt", "r")) == NULL) { puts("Can't open the input file."); exit(1); } //書き込みファイルのオープン if ((fpW = fopen("popu2000.txt", "w")) == NULL) { puts("Can't open the input file."); exit(1); } //ファイルからデータを読み込む //ただし、データファイルが正しく書かれていること! //戻り値がEOFならループから抜ける i = 0; while ( fscanf(fpR, "%s%d", pft[i].name, &pft[i].population) != EOF ) { printf( "【読込】『%s』の人口は%10d\n", pft[i].name, pft[i].population ); i++; } pft_num = i; fclose(fpR); //読み込みファイルを閉じる quicksort(pft, pft_num); //クイックソートで並び替え //データをファイルに書き込む for ( i = 0; i < pft_num; i++) { fprintf(fpW, "%s %10d\n", pft[i].name, pft[i].population); } fclose(fpW); //書き込み読み込みファイルを閉じる puts("\n『人口の多い都道府県順に表示する』\n"); ptr = &pft[0]; // ポインタをセット for ( i = 0; i < pft_num; ++i ) { printf( "【%2d】『%s』の人口は%10d¥n", i+1, ptr->name, ptr->population ); ++ptr; // ポインタを一つ進める }
}
//クイックソートを整列の配列に適用する
//降順に並べ替える
void quicksort( City *a, int n) {
int i = 0, j = n - 1, k = a[ j / 2 ].population;
do {
while (a[i].population > k)
i++;
while (k > a[i].population)
j--;
if (i < j) {
City w = a[i]; //入れ替え
a[i] = a[j];
a[j] = w;
}
} while( i++ <= j--);
if (i == j + 3) i--, j++; if(j >0) quicksort(&a[0], j + 1); if (i < n - 1) quicksort(&a[i], n-1);
}
void shaker_sort_city( City *a, int n ) {
int left = 0, right = n - 1;
int i, j = 0;
do { for ( i = left; i < right; ++i ) { // 左からみて // 昇順 if ( a[i].population > a[i + 1].population ) { if ( a[i].population < a[i + 1].population ) { City tmp = a[i]; a[i] = a[i + 1]; a[i + 1] = tmp; j = i; // i番目で入れ換えが発生した } } right = j; // 走査範囲の右側を更新 for ( i = right; i >left; i-- ) { // 左からみて // 昇順 if ( a[i - 1].population > a[i].population ) { if ( a[i - 1].population < a[i].population ) { City tmp = a[i]; a[i] = a[i - 1]; a[i - 1] = tmp; j = i; // i番目で入れ換えが発生した } } left = j; // 走査範囲の右側を更新 } while ( left < right );
}