2012/05/26

C言語 テキストファイル読込み fopen

ファイルの読み込みを行ってみる。まずは、テキストファイルを用意する。下の例ではsample.txtという名前のファイルをプログラムと同じ階層に置いている。中身は以下のようにした。

sample.txt
param0=1.000000
param1=0.513000
param2=0.120000
param3=0.110000
param4=0.000012

ファイルから1行読込プログラム

#include <stdio.h>
#include <stdlib.h>
int main(void) {
  FILE *fp;
  char str[128];
  fp = fopen("sample.txt", "r");
  if (fp == NULL) {
    exit(EXIT_FAILURE);
  } else {
    printf("%s", fgets(str, 128, fp));
  }
  fclose(fp);
  return 0;
}
このプログラムを実行すると、1行目の「param0=1.000000」だけがコマンドプロンプトに出力される。
上から説明すると、ファイルを扱うためにまず、<stdlib.h>が必要なのでincludeする。
FILE *fpはファイルポインタの宣言。これはファイルの入出力で必要な情報を管理する。
str[128]は、読み込んだテキストを格納するための配列を用意。サイズは1行がまるまる入るだろう大きさにしている。
fopenで指定したパスのファイルを開く。その際の「r」は、読込モードの指定。
if文。もしファイルがなければ、fpはNULLとなるので、その時点で終了させる。ファイルがあれば、elseの行を実行する。
fgetsでテキストを読み込んでいるのだが、fgetsは1行読み込む関数なので、改行があるところまで読み込んでいる。もしくはバイト数で指定することもできる。それをpintfでプロンプトに出力する。
最後にfcloseで開いたファイルを閉じて終了。
param0=1.000000
次にすべての行を読み込んでプロンプトに出力するプログラムに改造してみる。

ファイルを読み込むプログラム

#include <stdio.h>
#include <stdlib.h>
int main(void) {
  FILE *fp;
  char str[128];
  fp = fopen("sample.txt", "r");
  if (fp == NULL) {
    exit(EXIT_FAILURE);
  } else {
    for (;fgets(str, 128, fp) != NULL;) {
       printf("%s", str);
    }
  }
  fclose(fp);
  return 0;
}
for文を使って、1行ずつ読み込んでは、NULLになるまで繰り返している。読み込む行がなくなればNULLになるので、その時点でforから抜けて終了する。
param0=1.000000
param1=0.513000
param2=0.120000
param3=0.110000
param4=0.000012


C言語 ANSI C89 Meadow & MinGW GCC 目次はこちら