スポンサーリンク

2016年2月5日金曜日

C 言語でテキストファイルの内容を文字列配列で保持する

 久しぶりに C 言語のお話。

 テキストファイルを読み込んで、1 行の文字列を 1 つの要素とする文字列配列を作りたいとする。
 いろいろ調べたけど、どの例もあらかじめ配列を用意しているものだった。

char lines[10][10];

 とか。
 これを malloc とか realloc とか、はたまた memcopy とか memmove とか使って動的にメモリを割り当て、必要最小限の文字列配列を生成している例は見つからなかった。
 需要があるかどうかはともかく、いつか必要になりそうな気がするのでメモ。

 突貫で作ったのでもっと綺麗にできるだろうけどとりあえずこれで。

FILE *fp;
char **input = NULL;
char *line = NULL;
char *tmp = NULL;
char buf[BUF_SIZE];
int r_size = 0;
int cnt = 0;

while (fgets(buf, sizeof(buf), fp) != NULL) {
  char *ret = strchr(buf, '\n');

  if (ret == NULL) {
    tmp = (char *)realloc(line, r_size + BUF_SIZE);

    if (tmp == NULL) {
      free(input);
      fclose(fp);

      return;
    }

    line = tmp;
    memmove(line + r_size, buf, BUF_SIZE);
    r_size += BUF_SIZE- 1;
  }
  else {
    *ret = '\0';

    int len = strlen(buf);

    tmp = (char *)realloc(line, r_size + len + 1);

    if (tmp == NULL) {
      free(input);
      fclose(fp);

      return;
    }

    line = tmp;
    memmove(line + r_size, buf, len + 1);
    r_size = 0;
    cnt++;
    input = realloc(input, sizeof(char *) * cnt);
    input[cnt - 1] = line;
    line = NULL;
  }
}

 ファイルポインタを開いたり閉じたりするのは割愛で。
 あと、使用後のメモリの free は忘れずに。

0 件のコメント:

コメントを投稿