settingsログイン
メニュー

C言語: fscanfの挙動

閲覧 5
こんばんわ。

C言語はあまり明るくないんですが、興味本位で次のようなプログラムを書いてみました。

#include <stdio.h>
#include <stdlib.h>

#define MAXDATA 10000
#define KEY_NOT_FOUND EXIT_FAILURE

void read_file(int a[], char filename[]) {
  FILE* fin;
  int n = 0;
  if ((fin = fopen(filename, "r")) == NULL) {
    printf("ファイルをオープンできません\n");
    exit(EXIT_FAILURE);
  }
  while(!feof(fin) && n < MAXDATA) {
    fscanf(fin, "%d", &(a[n]));
    n++;
  }
  fclose(fin);

}

void bubbleSort(int a[], int n) {
  int i, j, k, tmp;
  for (k = n - 1; k > 0; k--) {
    for (i = 0; i < k; i++) {
      for (j = 1; j <= k; j++) {
        if (a[j] < a[j - 1]) {
          tmp = a[j]; a[j] = a[j - 1]; a[j - 1] = tmp;
        }
      }
    }
  }
}

int binary_search(int ary[], int key, int imin, int imax) {
  if (imax < imin) {
    return KEY_NOT_FOUND;
  } else {
    int imid = imin + (imax - imin) / 2;
    if (ary[imid] > key) {
      return binary_search(ary, key, imin, imid - 1);
    } else if (ary[imid] < key) {
      return binary_search(ary, key, imid + 1, imax);
    } else {
      return imid;
    }
  }
}

int main(int argc, char* argv[]) {
  char *endp, s[6];
  int x, a[MAXDATA], position;

  if (argc < 2) { return EXIT_SUCCESS; }

  read_file(a, argv[1]);
  bubbleSort(a, MAXDATA);

  scanf("%5s%*[^\n]%*c", s);
  x = strtol(s, &endp, 10);

  position = binary_search(a, x, 0, 99999);

  if (position == KEY_NOT_FOUND) {
    printf("見つからない\n");
  } else {
    printf("x=%d ---> %d\n", x, position);
    printf("またお会いしましょう\n");
  }
  return EXIT_SUCCESS;
}

ところがコンパイルして実行してみると、無限ループみたいにずーっと入力を促し続けます。
どうやら一番最初のread_file(ファイルから配列にデータを入れていく関数)の終了時点で引っかかってるらしく、延々と入力要請な状態に陥る模様です。
fscanfの記述方法が間違ってるんじゃないか、とあちこちのサイトで記述方法を調べて、書き換えてテストしてみたんですが、全く改善せず、ほとほと困り果てた状態です。
一体何が間違ってるんでしょうか。

なお、コマンドライン引数として与えるファイルはPythonで


import random

with open('hogehoge.dat', 'w', encoding = 'ascii') as f:
    [print(random.randint(1, 99999), file = f) for i in range(10000)]

として作成しています。
また、利用したOSはXubuntu 20.04LTSで、コンパイラはgcc 9.3.0. とclang 10.0.0を用いてみました。
匿名 8/13 質問 C言語

ログインまたはユーザー登録してから回答してください。

プログラミング・開発言語、C言語 の企業/事業者/教室/プロの方のホームページの集客、アクセスアップ、SEO対策効果が期待できるリスティングサイト=Ask-itをぜひご活用ください

Ask IT にようこそ。ここではコミュニティメンバーに質問したり、回答を得ることができます。
ITについて質問したい方へ ITについてプロに質問したい方は会員登録後すぐに質問をする事ができます。

プロフェッショナルの方へ 質問に答えていただけるプロフェッショナルの方は下記をご覧下さい

お気づきの点があれば是非お知らせください
...