C言語 入門 ファイル読み込み、ファイル出力を徹底解説!

pensive female worker choosing folder with documents in modern officeC Language

他のファイルに保存された文章を、プログラムで読み取り出来たらなあ。

コマンドプロンプトを使わないで簡単にファイルの入出力をしたい。

この記事を読めばこれらの悩みは解決できます。実際、コマンドプロンプトでもファイルの入出力はできます。過去に、コマンドプロンプトの使い方を紹介したので、そちらも参考にしてみてください。

 

そして、今回はコマンドプロンプトを使わずに、ファイルの操作ができるプログラムを解説します。

ファイル操作のプログラムを解説します!

man in black and white polo shirt beside writing board

ファイル操作は主に3つの目的に分けられます。

ファイルの読み込みをする

ファイルに上書きする

ファイルに追記する

この3つの中のいずれかの目的を達成するために、以下の3つの手順が必要になります。

ファイルを開く

ファイルの読み書きをする

ファイルを閉じる

最初に「ファイルを開く」という操作を解説します。

ファイルを開く

ファイル操作の目的によって、ファイルの開き方は異なります。ですが、必ず「ファイルポインタ」、「fopen関数」というものを使います。

「ファイル内の読み込み」をするときの「ファイルを開く方法」

「ファイル内の読み込み」という目的を達成するには、このようにプログラムを作ります。

FILE* fpr;
fpr = fopen("ファイル名", "r");
if (fpr == NULL)
{
	printf("This file don't exist.");
	exit(1);//stdlib.hをインクルード
}

ファイルポインタもポインタの一種なので、1行目のように

FILE* fpr;

のように変数宣言します。データ型に「FILE」を使うというのは、丸覚えしてください。

また、ファイルポインタは「*fpr」という名前にしましたが必ずこれじゃないとダメというわけではないです。ただ、「ファイル内の読み込み」には必ず「fopen関数」内で、「r」(readの略)を使うので、「*fpr」で統一した方が楽です。

また、「fopen関数」内にはファイル名も入力します。注意したいのは、拡張子も含めるということです。拡張子というのは、メモ帳とかだと「.txt」になります。

2行目のように

fpr=fopen(“~”,”〇”);

とすることで、ファイルポインタ「*fpr」にファイルのアドレスを代入できます。この時点でファイルの読み込みはできるのですが、探しているファイルが存在しないときのために3行目以降があります。

あまり理解する必要はないので、3行目から後ろのif文の部分はこれをそのままコピペでOKです。一応説明すると、読み込んだファイルが存在しないときに、ファイルが存在しないことを知らせ、「exist(1);」というものを使ってプログラムを終了します。ただし、「exist」を使うときは「stdlib.h」をインクルードする必要があります。

「ファイルに上書き」をするときの「ファイルを開く方法」

「ファイルに上書き」をするとき、指定したファイルが存在すれば上書きしてくれるのですが、存在しない場合コンピュータが自動的にそのファイルを作成するので、あらかじめ確認しておく必要があります。

プログラム自体は、「ファイルの読み込み」のプログラムの「r」を「w」に、「fpr」を「fpw」に置き換えるだけでOKです。

一応if文の中は、ファイルを新しく作ろうとしたときに、作れないことを知らせるように変更しましょう。

FILE* fpw;
fpw = fopen("ファイル名", "w");
if (fpw == NULL)
{
	printf("I can't make this file.");
	exit(1);//stdlib.hをインクルード
}

こんな感じで書けます。

「ファイルに追記」をするときの「ファイルを開く方法」

「ファイルに上書き」をするときと同じように、ファイルが存在す場合は追記をして、存在しない場合は新しくファイルを作成します。

「ファイルの読み込み」のプログラムの「r」を「a」に、「fpr」を「fpa」に置き換えるだけでOKです。

また、if文の中で、ファイルを新しく作ることができないことを知らせます。

FILE* fpa;
fpa = fopen("ファイル名", "w");
if (fpa == NULL)
{
	printf("This file don't exist and I can't make this file.");
	exit(1);//stdlib.hをインクルード
}

こんな感じになります。

基本的には以上の3通りによりファイルを開きます。

この後、「ファイル内の読み込み」、「ファイルに上書き」、「ファイルに追記」の目的を達成するために、次のようにプログラムの続きを書きます。

ファイルの読み書きをする

fscanfを使って、ファイル内の読み込み

「ファイル内の読み込み」をするときは、「fscanf関数」を使います。(これは、覚えてえなくてもいいのですが、「scanf関数」のもとは「fscanf関数」です。)

fscanf(fpr,"%s",inf);

コマンドプロンプトを説明したときと同じように文字を出力するならこのようにデータ型に「%s」を使います。

このように、fscanf関数の中には、ファイルポインタ、データ型、変数名もしくは配列名を入れます。ここで使う変数名、配列名は、読み込んだ文字や数字を保存するためのものです。

fprintfを使って、ファイルへの書き込み

「ファイルへの書き込み(上書きや追記)」をするときは、「fscanf関数」を使います。(「fscanf関数」と同じように、「printf関数」のもとは「fprintf関数」です。)

fprintf(fpw,"%s",inf);
fprintf(fpa,"%s",inf);

1行目が「ファイルに上書き」、2行目が「ファイルに追記」のときのプログラムです。

ファイルを閉じる

このようにして目的を達成したら最後に必ず、開いたファイルを閉じましょう。

ファイルを閉じるときに使う関数が「fclose関数」です。

fclose(fpr);
fclose(fpw);
fclose(fpa);

使ったファイルポインタを「fclose関数」の中に入れることで、そのファイルを閉じることができます。

ここまでがファイルの操作になります。

ファイル内の読み込みをするプログラム

では、実際に練習でプログラムを書いてみましょう。

コマンドプロンプトの説明をしたときと全く同じ結果を出すプログラムを作ります。

#define _CRT_SECURE_NO_WARNINGS
#define N 6
#define NAME 10
#include <stdio.h>
#include <stdlib.h>

int main()
{
    int i;
    char inf[NAME];
    FILE* fpr;

    fpr = fopen("info.txt", "r");
    if (fpr == NULL)
    {
	printf("This file don't exist.");
	exit(1);
    }
    for (i = 0; i < N; ++i)
    {
	fscanf(fpr, "%s", &inf);
	printf("%s¥n", inf);
    }
    fclose(fpr);
}

このようにして、「info.txt」というファイルに保存した文字を読み取って出力結果の画面で表示されるプログラムをつくれます。ここでは、ファイルの読み取りをしているため、「*fpr」を使っています。

このようにして、「info.txt」と全く同じ内容が出力されました。

ファイルの保存場所には要注意!

先ほどのプログラムをつくるときに注意したいのは、読み取りをするファイルの保存場所です。

みなさんがVisual Studioなどでプログラムを作成する時に、必ずファイルの保存先(プロジェクトの保存先)を決めているはずです。そのファイル内に、読み取り用のファイルを保存しましょう。コマンドプロンプトの説明のときは、「Release」のファイル内に保存すると言いましたが、今回の場合、「Release」のファイル内では読み取りできません。気を付けましょう。

まとめ

pondering female secretary picking folder in workplace

今回のプログラムの説明を見て、コマンドプロンプトの方が簡単だなって思った人もいるかもしれませんが、その分、今回のプログラムは融通が利きます。ファイルに追記するか、上書きするか選べるのはもちろんですが、一回プログラムをつくれば後でとても楽です。コマンドプロンプトを使って、ファイル名を入力したりといった苦労をしないで済みますから。

次は、ファイル入出力関数を勉強してみましょう。