この記事では、C言語でのファイル処理の基礎を学びます。
基本的なファイル処理プログラム
とり合えずこんなプログラムです。
file1.c
#include <stdio.h> #include <stdlib.h> int main(void) { FILE *fp; int c; /* ファイルを開く */ fp = fopen ("hoge.txt", "r") ; if(fp == NULL){ /* ファイルが開けないときの処理 */ printf("ファイルが開けません\n"); exit(EXIT_FAILURE); } /* 1文字読み込んで表示する */ c = fgetc(fp); printf("%c", c); /* ファイルを閉じる */ fclose ( fp ) ; return 0; }
これはhoge.txtというファイルの先頭の1文字(半角1文字)を読み取って画面に表示するプログラムです。
例えば、hoge.txtの中身が次のように保存されているとします。
Hello!
C programming!
上記プログラムを実行すると、画面には
H
とだけ表示されます。ファイルの先頭の1文字を読み取って画面に表示したわけです。
プログラムが正常に実行されるには、上記プログラムの実行ファイルと同じフォルダにhoge.txtファイルが存在している必要があります。
もし、hoge.txtファイルが存在しない場合は、プログラム実行後に
ファイルが開けません
とメッセージを表示してプログラムを終了します。
プログラム解説
C言語のファイル処理で必須の記述がFILE *fp;の部分です。(ちなみにfpの部分は変数名なのでなんでもOKです)
FILE *fp;
C言語の場合、FILEという記述が先頭にあればファイル処理のプログラムだな、と考えて頂いて結構です。
FILEはファイル構造体と呼ばれています。(ファイルポインタとも呼ばれます)ファイル構造体変数を通じてファイルにアクセスできるようになります。
参考
上記例では、hoge.txtというファイルを読み取りモードで開いています。(読み取りモードについては後述)
fp = fopen (“hoge.txt”, “r”) ;
ファイルを開くには、fopen関数を使います。
fopen関数の書式
ファイルを開く際は、「ファイル名」が必要です。
また、ファイルを開く際に必要になるのが、ファイルを開くときの「モード指定」です。
モード指定は3つあります。
読み取りモード(read)、書き込みモード(write)、追加書き込みモード(append)です。
この点は、少し違和感を持つ方も多いかと思います。
例えばノートを開く前に、「読むだけです」とか「書き込むだけです」とあらかじめ決めて使う人はあまりいませんよね。
でも融通が利かないのが、コンピュータです。
これらは3つのモードはそれぞれ頭文字をとってr, w, aで表します。
fopen関数で指定できる3つのモード
r | 読み取り | ファイルが存在するとき読み込み専用として開く。書き込みは出来ない。ファイルが存在しないときNULLを返す |
w | 書き込み | ファイルを新規作成し書き込み専用として開く。読み取りは出来ない。ファイルが存在するとき上書き(以前の内容が消える)。ファイルが存在しないとき新規作成 |
a | 追加書き込み | 既存のファイルを書き込み用として開く。ファイルが存在するとき、ファイルの末尾から追加書き込み。ファイルが存在しないとき新規作成。 |
※いずれのモードでも、fopenに成功した場合、ファイルポインタ(開いたファイルの先頭位置と考えてください)を、失敗した場合、NULLを返す。
例えばファイル名「hoge.txt」を書き込みモードで開くには以下のようにします。
通常のアプリで上書き保存をしても同じファイル名が存在すればちゃんと「このファイル名はすでに存在します。上書きしますか?」などと聞いてくれます。C言語のプログラムからwモードでファイルを開いた場合は、そのファイルが既に存在していても新規作成してしまいます。つまり中身はまっさらな状態になります。大事なファイルだと大変なことになります。くれぐれも注意してください。
ファイルをfopen関数で開いた後、すぐにファイルから読み取ったり書き込んだりする訳にはいきません。
指定したファイルがコンピュータ上(補助記憶装置上)に存在しない場合もあるからです。もしかするとファイルは存在しているが読み取りできない場合もあるかもしれません。
そこで以下のエラー処理がfopen関数を実行後に必要になります。
if(fp == NULL){ /* ファイルが開けないときの処理 */ printf("ファイルが開けません\n"); exit(EXIT_FAILURE); }
上記、if文はなんらかの理由により指定したファイルが開けない場合のエラー処理です。業務で作るプログラムであればこの処理が無いと致命的でしょう。
エラーメッセージを出力してexit関数によりプログラムを強制終了しています。(ちなみにプログラム冒頭でstdlib.hをインクルードしているのは、このexit関数を利用するためです)
exit関数については以下が詳しいです。
正常にファイルを開くことが出来れば、読み取りや書き込みが可能となります。
今回は読み取りモードで開いたので読み取りを行います。
/* 1文字読み込んで表示する */ c = fgetc(fp); printf("%c", c);
fgetc関数は、ファイルポインタで示されるファイルからバイト文字(半角1文字)を読み取ります。
fgetc関数の戻り値はint型なのでint型変数のcに戻り値を代入しています。
その後、変数cに代入された文字をprintf関数で文字として表示しています。
最後にファイルをfclose関数で閉じて終了です。
/* ファイルを閉じる */ fclose ( fp ) ;
fclose関数の引数にはfopen関数でファイルを開いたときに受け取ったファイルポインタfpを指定しています。
このようにファイル構造体変数は、ファイル処理の関数で必ず指定することになります。ファイルポインタfpは、どのファイルに対してその処理を行うか?の際の指定先ファイルを指している訳です。
以上、冒頭プログラムの処理を流れを追って説明しました。
C言語でのファイル処理とは?
ファイルは、コンピュータ上でデータを扱いやすくした単位です。WindowsやLinux、Mac、あるいはスマホの画面上ではアイコンで表示されていることが多いです。
これらのファイルは、最初からコンピュータに保存されていたか、あるいは皆さんがワードなどのアプリを起動して自分で保存したファイルのどちらかだと思います。
ワードやエクセルなどで保存したファイルは、皆さんが自分で操作してファイルに名前をつけて保存します。ファイルを開くときも自分で保存したドキュメントのアイコンなどをダブルクリックして開きます。
前述したような「ファイルの新規作成」「ファイルからを開いて中身を見る(読み取る)」「ファイルに書き込む」などの処理をプログラムを作ってコンピュータにやらせよう、というのがC言語でのファイル処理ということになります。
「ファイル」という言葉が登場したので、更に説明します。
コンピュータでのファイルは1冊のノートみたいなもの
1冊のノートをイメージして下さい。これがファイルです。
例えば、あなたが小学生で「算数」とか「社会」とか科目ごとにノートを取っているとします。
「算数」のノートには、表紙に「算数」と書いてあります。
ノートの表紙に書かれた名前でどのノートかを特定できるということになります。ノートを特定するための名前、これがファイル名です。
ノートの内容を見るには、ノートを開く必要があります。
ノートを開かないと、ノートに書かれた内容を読んだり、書き込んだり出来ません。
そして、読み終えたり、書き込んだ後は、ノートを閉じます。
これら一連の流れは全てC言語の関数として定義されています。
以下の「ファイル」を「ノート」に置き換えて読んでみてください。
ファイルを開く | fopen関数 |
ファイルを閉じる | fclose関数 |
ファイルから読み込む | fgetc, fgets, fscanf |
ファイルに書き込む | fputc, fputs, fprintf |
読み書きの関数は、機能によって複数存在します。
どれを使うかは、作るプログラムの性質によります。
C言語でファイル処理のプログラムを作成すると基本的に次のような流れになります。
以上、C言語でのファイル処理の基礎を解説しました。
コメント