Linux講座にようこそ。このページは「C言語プログラミング入門 - 第14章.ライブラリ関数 - 入出力ライブラリ」講座です。

C言語プログラミング入門

14. ライブラリ関数(3/36) - 入出力ライブラリ(2/10)

14.2 ファイル操作関数

14.2.1 fopen関数

fopen関数はファイルの入出力を行うための準備(オープン)を行ないます。また、入出力完了後はfclose関数で後処理(クローズ)が必要です。従って、fopen関数とfclose関数はペアで使用します。

【表14-1-2】 fopen関数
形式#include <stdio.h>
FILE *fopen(const char *file_path, const char *io_mode);
返り値ファイルのオープンが出来た場合はファイルポインタを返し、出来なかった場合はNULLポインタを返します。
引数
const char *file_path
オープンするファイルのパス名を文字列で指定します。
const char *io_mode
入出力の区分(モード)を「【表14-1-3】 入出力モード一覧」で示す文字列で指定します。
使用法、

返り値がNULLポインタ以外の場合はファイルのオープンが出来ましたので、ファイルポインタを保存しておき、以降の処理でファイルポインタを使用して入出力を行ないます。

返り値がNULLポインタの場合はファイルのオープンが出来ていませんので、通常はエラー処理を行いプログラムを終了します。

【表14-1-3】 入出力モード一覧
モード意味
"r"既存ファイルを読み出し専用でオープンします。
"w"新規あるいは、既存ファイルを書き込み専用でオープンします。既存ファイルの場合は上書きとなります。
"a"新規あるいは、既存ファイルを書き込み専用でオープンします。既存ファイルの場合はファイルの末尾に追加書きとなります。
"r+"既存ファイルを更新用(読み出し、書き込みの両方)でオープンします。
"w+"新規あるいは、既存ファイルを更新用でオープンします。既存ファイルの場合は上書きとなります。
"a+"新規あるいは、既存ファイルを更新用でオープンします。既存ファイルの場合はファイルの末尾に追加書きとなります。

14.2.2 fclose関数

fclose関数はファイル入出力の後処理(クローズ)を行ないます。プログラムの実行終了時にオープンしたままのファイルがあると、自動的にクローズしますので、クローズしなくても多くの場合は問題ありません。ただし、同時にオープンできるファイルの数には制限がありますので、多くのファイルを取り扱う場合には、オープンしたファイルをクローズして、別のファイルをオープンするといった様なことを行う必要があります。また、プログラミングスタイルとして、オープンしたファイルは明示的にクローズするようにした方が良いでしょう。

【表14-1-4】 fclose関数
形式#include <stdio.h>
int fclose(FILE *fp);
返り値ファイルのクローズが出来た場合は0を返し、出来なかった場合はEOFを返します。
引数
FILE *fp
クローズするファイルのファイルポインタを指定します。

【14.2.3】 fflush関数

fflush関数はバッファに保持されている出力データをファイルに出力します。バッファが満杯になったり、fclose関数が実行されるとバッファの内容はファイルに出力されますので、通常はfflush関数を使う必要はありません。ただし、長時間実行するプログラムでログファイルなどを出力し続ける場合は、一定時間経過したら、強制的にバッファの内容を出力するといったことが必要かもしれません。

fflush関数実行後もファイルはオープンしたままですので、引き続き入出力は行えます。

【表14-1-5】 fflush関数
形式#include <stdio.h>
int fflush(FILE *fp);
返り値正常に出力できた場合は0を返し、出来なかった場合はEOFを返します。
引数
FILE *fp
バッファの内容を出力するファイルのファイルポインタを指定します。

14.2.4 freopen関数

freopen関数は次のことを行ないます。

  1. 第3引数で指定したファイルポインタに対応するファイルをクローズします。
  2. 第1引数で指定したファイルをオープンし、ファイルポインタを作成します。
  3. 第3引数で指定したファイルポインタを、上記ファイルポインタの値に更新します。

freopen関数は予め用意されているファイルポインタ(stdin、stdout、stderr等)を、一般ファイル用に使いたいときなどに使うようです。

【表14-1-6】 freopen関数
形式#include <stdio.h>
FILE *freopen(const char *file_path, const char *io_mode, FILE *fp);
返り値第1引数のfile_pathで指定したファイルが正常にオープンできた場合はfile_pathのファイルポインタを返し、オープンできなかった場合はNULLポインタを返します。
引数
const char *file_path
オープンするファイルのパス名を文字列で指定します。
const char *io_mode
fopen関数の入出力区分(モード)と同じです。「【表14-1-3】 入出力モード一覧」を参照してください。
FILE *fp
既に作成済みのファイルポインタを指定します。第1引数で指定したファイルのファイルポインタに内容を変更されます。

14.2.5 例題

カレントディレクトリの下にあるtemp.txtファイルのオープンとクローズを行ないます。fopen関数とfclose関数の使用法を説明するだけのプログラムですので、実用性はまったくありません。

  1. #include <stdio.h>
  2. int main(void)
  3. {
  4.     char    *out_file = "temp.txt";
  5.     FILE    *fp;
  6.     int     return_code = 0;
  7.  
  8.     fp = fopen(out_file, "r");
  9.     if(fp != NULL)
  10.     {
  11.         /* オープン成功 */
  12.         printf("%sファイルのオープンは成功しました\n", out_file);
  13.  
  14.         if(fclose(fp) == 0)
  15.         {
  16.             /* クローズ成功 */
  17.             printf("%sファイルのクローズは成功しました\n", out_file);
  18.         }
  19.         else
  20.         {
  21.             /* クローズ失敗 */
  22.             printf("%sファイルのクローズは失敗しました\n", out_file);
  23.             return_code = 1;
  24.         }
  25.     }
  26.     else
  27.     {
  28.         /* オープン失敗 */
  29.         printf("%sファイルのオープンは失敗しました\n", out_file);
  30.         return_code = 1;
  31.     }
  32.  
  33.     return return_code;
  34. }
$ ls -l temp.txt ← temp.txtファイルの確認です
ls: cannot access temp.txt: そのようなファイルやディレクトリはありません
$ ./ex14_1_1.prg ← temp.txtファイルは有りませんのでオープンは失敗します
temp.txtファイルのオープンは失敗しました
$ echo $?
1
$
$ cat > temp.txt ← temp.txtファイルを作成します
Hello World!!.
$ ls -l temp.txt ← temp.txtファイルの確認です
-rw-r--r-- 1 merry users 15 2007-12-06 10:43 temp.txt
$ ./ex14_1_1.prg
temp.txtファイルのオープンは成功しました
temp.txtファイルのクローズは成功しました
$ echo $?
0
$
1行目
入出力ライブラリ関数を使用しますので、stdio.hファイルを取り込みます。
5行目
オープンしたファイルのファイルポインタを保存しておくためのポインタ変数を宣言します。
8行目
fopen関数でtemp.txtファイルをオープンします。返り値のファイルポインタは変数fpに代入しておきます。
9行目
オープン出来たかをチェックします。
14行目
fclose関数でtemp.txtファイルをクローズし、返り値のチェックを行ないます。