スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

サイズ不定のテキストファイルを読み込むCプログラムの例

テキストファイルごとに必要なメモリを動的に確保してデータを読み込むC言語プログラムについて、fseek関数を利用する例とrealloc関数を利用する例を紹介。

readTextFile関数の概要

引数に指定した名前のテキストファイルを読み込み、その中身の文字列をchar型のポインタとして返すreadTextFile関数を作ることが今回の目標です。

readTextFile関数の使用例は以下のとおりです:

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

char* readTextFile(const char* filename);

int main(int argc, char* argv[])
{
  const char *filename = "textfile.txt";
  char *text = NULL; 

  /* 引数からtxtファイルの名前を取得 */
  if (argc >= 2) {
    filename = argv[1];
  }

  /* テキストデータの読み込み */
  text = readTextFile(filename);

  printf("%s", text);

  /* メモリを動的に確保するので解放が必要 */
  free(text); text = NULL;

  return 0;
}

char* readTextFile(const char* filename)
{
  /* 後述 */
}

上記のプログラムをコンパイルしてできた実行ファイルを実行する時、テキストファイルの名前を引数に指定します。引数を省略すると、"textfile.txt"という名前が指定されます。

fseek関数を利用する例

readTextFile関数の実装例。fseek関数とftell関数を利用して、ファイルの大きさを取得します。

char* readTextFile(const char* filename) 
{
  FILE *fp = NULL;
  char buf[256];
  char* str = NULL;
  int fsize;

  /* ファイルのオープン */
  fp = fopen(filename, "r");
  if (fp == NULL) {
    printf("Can't read '%s'.\n", filename);
    exit(1);
  };

  /* ファイルサイズの取得 */
  fseek(fp, 0L, SEEK_END);
  fsize = ftell(fp);

  /* メモリの動的確保 */
  str = (char*)malloc(fsize * sizeof(char)); 
  if (str == NULL) {
    printf("Can't allocate memory. 'str' is NULL.\n");
    fclose(fp);
    exit(1);
  }

  /* シーク位置を先頭に戻す */
  fseek(fp, 0L, SEEK_SET);

  /* テキストデータの読み込み */
  str[0] = '\0';
  while (fgets(buf, sizeof(buf), fp) != NULL) {
    strncat(str, buf, strlen(buf) + 1);
  }

  /* ファイルのクローズ */
  fclose(fp);  

  return str;
}

realloc関数を利用する例

readTextFile関数の実装例。realloc関数でメモリをだんだんと拡張していきます。

char* readTextFile(const char* filename) 
{
  FILE *fp = NULL;
  char buf[256];
  char* str = NULL;

  /* ファイルのオープン */
  fp = fopen(filename, "r");
  if (fp == NULL) {
    printf("Can't read '%s'.\n", filename);
    exit(1);
  };

  /* テキストデータの読み込み */
  str = (char*)malloc(sizeof(char)); 
  if (str == NULL) {
    printf("Can't allocate memory. 'str' is NULL.\n");
    fclose(fp);
    exit(1);
  }
  str[0] = '\0';
  while (fgets(buf, sizeof(buf), fp) != NULL) {
    str = (char*)realloc(str, strlen(str) + strlen(buf) + 1);
    if(str == NULL) {
      printf("Can't reallocate memory. 'str' is NULL.\n");
      fclose(fp);
      exit(1);
    }
    strncat(str, buf, strlen(buf) + 1);
  }

  /* ファイルのクローズ */
  fclose(fp);  

  return str;
}

【theme : プログラミング
【genre : コンピュータ

プロフィール

よしいず

Author:よしいず
MATHEMATICS.PDFというウェブサイトを運営しています。

管理の都合上、トラックバックとコメントはオフにしてあります。ブログ経験者なら分かっていただけると思いますが、スパム(アダルトやその他の宣伝)ばかりなのが現実です。

リンクは自由です。当サイトの記事に対する間違いの指摘・意見・感想などを述べた記事からのリンクは歓迎です。ただし、ブログ記事アップ直後はミスが多く、頻繁に修正します。場合によっては削除する可能性もあります。その際、何も断りもなく修正・削除しますがご了承ください。内容を参考にする場合には投稿後一週間ほど様子を見てからにしてください(笑)。

記事の間違いを指摘するときは、その具体的箇所、理由(仕様に反するなど)・根拠(参考にした文献など)、代替案(同じ結果を得るための正しいやり方)も教えてください。そうしないと、(指摘される側および第三者はその時点では無知の状態なので、)どこが間違いなのか分かりませんし、本当に間違っているのかどうかが判断・検証できません。実際、間違いだと指摘されたことが結局は正しかったというケースもありますので。

このブログのタイトル一覧

リンク
月別アーカイブ
カテゴリ
最新記事
検索フォーム
RSSリンクの表示
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。