C 言語でファイルを読む
この記事では、C 言語でテキストファイルを読み込む方法について複数の方法を紹介します。
関数 fopen
と fread
を使って C 言語でテキストファイルを読む
関数 fopen
と fread
は C 標準ライブラリの入出力機能の一部です。
fopen
は、与えられたファイルをストリームとして開き、必要に応じてファイルを操作するためのハンドルをプログラムに与えるために用いられます。これは 2つのパラメータを持ち、ファイル名を const char*
文字列で指定し、ファイルを開くモードを定義済みの値(r
、w
、a
、r+
、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);
}
関数 fopen
と getline
を用いて 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);
}