質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

1回答

1679閲覧

C言語でEOFの使い方

poaro

総合スコア1

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

2クリップ

投稿2020/12/01 14:34

編集2020/12/02 01:40

前提・実現したいこと

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 );

}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2020/12/01 22:05

このままではコードが読みづらいので、質問を編集し、<code>ボタンを押し、出てくる’’’の枠の中にコードを貼り付けてください
thkana

2020/12/01 22:44 編集

「起動」というのは、一般的に処理を最初から始めるということですが、「EOFが起動」とはどういう意味ですか? 「所得」というのは...辞書を引いてみてください(検索でもいいですけれど) 本題に関係ない? いや、そういうのをいい加減にやっているとプログラムもいい加減になりがちですから。 で、 > 想定通りに どういう想定をしていますか > 動作を終了しない。 目の前で起こっている事象をそのまま書いてください。
javahack

2020/12/02 01:50

質問を編集するなら、y_waiwaiさんのコメントを参考にしてコードも読みやすいように修正しましょう。
kazuma-s

2020/12/02 02:28

入力データに依存する問題かもしれません。 pop200.txt の内容を質問に追加してください。あるいは、 そのファイルの行数を減らして、例えば先頭3行だけのファイルにしても同じ結果になりますか?
guest

回答1

0

while ( fscanf(fpR, "%s%d", pft[i].name, &pft[i].population) != EOF ) {

ここは間違ってないので、次のソートで無限ループしていると思います。
ソート関数単独のテストをしていないのでは?

EOFがうまく起動できません

データを所得し

日本語の単語を覚えましょう。もしくは、全ての単語を使う前に辞書を引きましょう。

投稿2020/12/02 01:01

otn

総合スコア84499

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問