C 言語でファイルを読む

胡金庫 2023年10月12日
  1. 関数 fopenfread を使って C 言語でテキストファイルを読む
  2. 関数 fopengetline を用いて C 言語のテキストファイルを読み込む
C 言語でファイルを読む

この記事では、C 言語でテキストファイルを読み込む方法について複数の方法を紹介します。

関数 fopenfread を使って C 言語でテキストファイルを読む

関数 fopenfread は C 標準ライブラリの入出力機能の一部です。

fopen は、与えられたファイルをストリームとして開き、必要に応じてファイルを操作するためのハンドルをプログラムに与えるために用いられます。これは 2つのパラメータを持ち、ファイル名を const char* 文字列で指定し、ファイルを開くモードを定義済みの値(rwar+w+a+)で指定します。ファイルを読み込む必要がある場合には、2 番目のパラメータとして r を渡すと、読み込み専用モードでファイルを開くことができます。

一方、fread 関数は既にオープンされているファイルストリームからの読み込み操作を行う際の主役です。第一引数には読み込みバイトを格納するバッファへのポインタを取ります。第 2 引数と第 3 引数は、ストリームから読み込む項目の数と、それぞれのサイズを指定します。最後の引数は、オープンされたファイルストリームそのものへのポインタ FILE* です。

ファイルのサイズを取得し、1 回の fread 呼び出しで内容全体を読み込むために stat 関数も利用していることに注意してください。ファイルの内容全体を格納するのに十分なスペースを割り当てるために、malloc 関数にも渡されます。ただし、動的なメモリ割り当ては free 関数で解放し、ファイルを開くときは fclose で閉じることに注意してください。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>

int main(void) {
  const char* filename = "input.txt";

  FILE* input_file = fopen(filename, "r");
  if (!input_file) exit(EXIT_FAILURE);

  struct stat sb;
  if (stat(filename, &sb) == -1) {
    perror("stat");
    exit(EXIT_FAILURE);
  }

  char* file_contents = malloc(sb.st_size);
  fread(file_contents, sb.st_size, 1, input_file);

  printf("%s\n", file_contents);

  fclose(input_file);
  free(file_contents);

  exit(EXIT_SUCCESS);
}

関数 fopengetline を用いて C 言語のテキストファイルを読み込む

代わりに、stat 関数でファイルサイズを取得するのを省略して、getline 関数を用いてファイルの各行を末尾に到達するまで繰り返し処理することもできます。getline は与えられたファイルストリームから入力された文字列を読み込みます。名前が示すように、この関数は改行文字が見つかるまですべてのバイトを取得します。

getline は 3つのパラメータを取り、最初のパラメータには読み込んだバイトを格納します。このパラメータは char* と宣言して NULL に設定することができます。一方、第 2 引数に整数 0 のアドレスを指定すると、getline は自動的にダイナミックメモリをバッファに割り当てる。

これらのパラメータは必要に応じて異なる値を持つことができることに注意してください。3 番目のパラメータは、開いているファイルストリームの FILE* ポインタです。

#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>

int main(void) {
  const char* filename = "input.txt";

  FILE* input_file = fopen(filename, "r");
  if (!input_file) exit(EXIT_FAILURE);

  char* contents = NULL;
  size_t len = 0;
  while (getline(&contents, &len, input_file) != -1) {
    printf("%s", contents);
  }

  fclose(input_file);
  free(contents);

  exit(EXIT_SUCCESS);
}
著者: 胡金庫
胡金庫 avatar 胡金庫 avatar

DelftStack.comの創設者です。Jinku はロボティクスと自動車産業で8年以上働いています。自動テスト、リモートサーバーからのデータ収集、耐久テストからのレポート作成が必要となったとき、彼はコーディングスキルを磨きました。彼は電気/電子工学のバックグラウンドを持っていますが、組み込みエレクトロニクス、組み込みプログラミング、フロントエンド/バックエンドプログラミングへの関心を広げています。

LinkedIn Facebook

関連記事 - C File