C言語 PR

【C言語】ファイルを読み書きする方法

記事内に商品プロモーションを含む場合があります

この記事では、C言語でファイルを読み書きする方法を解説します。

プログラミングをしているとファイルの内容を読み込んでコード内で使用したり、逆に処理した内容をファイルに書き込んで保存しておきたい場合があります。

それでは、ファイルを操作する方法を見ていきましょう。

ファイルを開く

ファイルを開くにはfopen()関数を使います。

#include <stdio.h>

FILE *fopen(const char *filename, const char *mode);

fopen()関数には、以下のような引数が定義されています。

引数名
filename ファイル名
mode ファイルのモードを文字列で指定

指定できるmodeには以下のようなものがあります。

文字 モード
r テキストファイルを読み込みモードで開く。指定されたfilenameのファイルが存在しない場合Noneを返す。
w テキストファイルを書き込みモードで開く。指定されたfilenameのファイルが存在する場合、長さ0に切り捨てる。存在しない場合、その名前のファイルが新規作成される。
a テキストファイルを書き込みモードで開く。指定されたfilenameのファイルが存在する場合、ファイルの末尾に追記する。存在しない場合、その名前のファイルが新規作成される。
rb rのバイナリファイルを扱うバージョン。
wb wのバイナリファイルを扱うバージョン。
ab aのバイナリファイルを扱うバージョン。
r+ テキストファイルを更新モードで開く。更新モードでは読み書きが可能。
w+ テキストファイルを更新モードで開く。指定されたfilenameのファイルが存在する場合、長さ0に切り捨てる。存在しない場合、その名前のファイルが新規作成される。
a+ テキストファイルを更新モードで開く。指定されたfilenameのファイルが存在する場合、ファイルの末尾に追記する。存在しない場合、その名前のファイルが新規作成される。
rb+ または r+b r+のバイナリファイルを扱うバージョン。
wb+ または w+b w+のバイナリファイルを扱うバージョン。
ab+ または a+b a+のバイナリファイルを扱うバージョン。

fopen()関数によって生成されたファイルポインタを使ってファイルを読み書きしていきます。

ファイルを閉じる

開いたファイルは使い終わったらfclose()関数を使って閉じる必要があります。

#include <stdio.h>

int fclose(FILE *stream);

stream引数で指定されるストリームをフラッシュして関連付けられているファイルを閉じます。

例えば、適当なファイルを読み込みモードで開いて閉じるには以下のようにします。

#include <stdio.h>

int main() 
{
    FILE *fp;                  // ファイルポインタ
    char *fname = "test.txt";  // ファイル名

    // 読み込みモードでファイルを開く
    fp = fopen(fname, "r");

    // ファイルを閉じる
    fclose(fp);
}

読み込み

ファイルを読み込むには、ファイルを読み込みモードで開く必要があります。

fp = fopen(fname, "r");

ファイルが開けていなかった場合には、Noneが返されるので内容を読み込む前にNoneかどうかを判定すると安全です。

#include <stdio.h>

int main() 
{
    FILE *fp;
    char *fname = "test.txt";

    fp = fopen(fname, "r");

    // ファイルが開けたかどうかの確認
    if(fp == NULL) {
        printf("%s は開けませんでした!\n", fname);
        return -1;
    }

    fclose(fp);
}

ここでは、以下のようなtest.txtを読み込んでみます。

test.txt

name: Mike
age: 27

ファイルを読み込むには「1文字ずつ読み込む方法」と「1行ずつ読み込む方法」があります。それぞれの方法を見ていきましょう!

1文字ずつ読み込む

fgetc関数を使うことで1文字ずつ読み出すことができます。

#include <stdio.h>

int fgetc(FILE *stream);

例として1文字ずつ読み込んで出力してみます。

#include <stdio.h>

int main() 
{
    FILE *fp;                  // ファイルポインタ
    char *fname = "test.txt";  // ファイル名
    int c;                     // 文字

    // 読み込みモードでファイルを開く
    fp = fopen(fname, "r");

    // ファイルが開けたかどうかの確認
    if(fp == NULL) {
		printf("%s は開けませんでした!\n", fname);
		return -1;
	}

    // 1文字読み込む
    c = fgetc(fp);
    // 1文字出力
    putchar(c);

    c = fgetc(fp);
    putchar(c);

    c = fgetc(fp);
    putchar(c);

    // ファイルを閉じる
    fclose(fp);
}

実行結果

nam

ファイルの内容を全て読み込むには、EOFが返されるまで読み込めば良い。

#include <stdio.h>

int main() 
{
    FILE *fp;                  // ファイルポインタ
    char *fname = "test.txt";  // ファイル名
    int c;                     // 文字

    // 読み込みモードでファイルを開く
    fp = fopen(fname, "r");

    // ファイルが開けたかどうかの確認
    if(fp == NULL) {
		printf("%s は開けませんでした!\n", fname);
		return -1;
	}

    // EOF が返されるまで読み込む
    while((c = fgetc(fp)) != EOF) {
		putchar(c);
	}

    // ファイルを閉じる
    fclose(fp);
}

実行結果

name: Mike
age: 27

1行ずつ読み込む

fgets関数を使うことで1行ずつ読み込むことができます。

#include <stdio.h>

char *fgets(char *s, int n, FILE *stream);

例として1行ずつ読み込んで出力してみます。

#include <stdio.h>

#define N 32

int main() 
{
    FILE *fp;                  // ファイルポインタ
    char *fname = "test.txt";  // ファイル名
    char s[N];                 // 文字列

    // 読み込みモードでファイルを開く
    fp = fopen(fname, "r");

    // ファイルが開けたかどうかの確認
    if(fp == NULL) {
        printf("%s は開けませんでした!\n", fname);
        return -1;
    }

    // 1行読み込む
    fgets(s, N, fp);
    // 1行出力
    printf("%s", s);

    fgets(s,LENGTH,fp);
    printf("%s", s);

    // ファイルを閉じる
    fclose(fp);
}

実行結果

name: Mike
age: 27

ファイルの内容を全て読み込むには、NULLが返されるまで読み込めば良い。

#include <stdio.h>

#define N 32

int main() 
{
    FILE *fp;                  // ファイルポインタ
    char *fname = "test.txt";  // ファイル名
    char s[N];                 // 文字列

    // 読み込みモードでファイルを開く
    fp = fopen(fname, "r");

    // ファイルが開けたかどうかの確認
    if(fp == NULL) {
        printf("%s は開けませんでした!\n", fname);
        return -1;
    }

    // NULL が返されるまで読み込む
    while(fgets(s, N, fp) != NULL) {
        printf("%s", s);
    }

    // ファイルを閉じる
    fclose(fp);
}

実行結果

name: Mike
age: 27

書き込み

ファイルに書き込むには、ファイルを書き込みモードで開く必要があります。

fp = fopen(fname, "w");

ファイルに書き込むには、fprintf()関数を使います。

#include <stdio.h>

int fprintf(FILE *stream, const char *format, ...);

stream引数で指定されるストリームにformat引数で指定された文字列が出力される。それ以降に続く引数は、format引数内の変換指定子に渡される。

適当に簡単なファイルを作成し、書き込んでみます。

#include <stdio.h>

int main() 
{
    FILE *fp;                  // ファイルポインタ
    char *fname = "test.txt";  // ファイル名
    char name[16];             // 名前を受け取る変数

    // 名前の入力
    printf("名前: ");
    fgets(name, sizeof(name), stdin);

    // 書き込みモードでファイルを開く
    fp = fopen(fname, "w");

    // 受け取った名前を書き込む
    fprintf(fp, "name: %s\n", name);

    // ファイルを閉じる
    fclose(fp);
}

実行

$ gcc main.c -o main
$ ./main            
名前: abc

すると、以下のようなファイルが生成されます。

test.txt

name: abc