ファイルの読み書き

こんにちは、めのんです!

今回はファイルの読み書きについて解説します。
ファイルを読み書きする関数はたくさんあるんですけど、今回は本当に最小限のものにとどめることにします。

オープンとクローズ

Cでファイルの読み書きを行うには必ずオープンとクローズが必要になります。
PHPではfile_get_contents関数などオープンやクローズが必要ないものもありますけど、Cにはそういうのはありません。
標準入出力をリダイレクトすればオープンやクローズが必要なくなりますが、それはまた別の話ですよね。

fopen関数

ファイルのオープンには「fopen関数」を使います。
PHPにもfopen関数がありますが、Cのfopen関数はもっとシンプルです。

fopen関数は「stdio.h」ヘッダで次のように宣言されています。

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

使い方もPHPとだいたい同じですが、使えるモードに違いがあります。
あと、引数が2つしかありませんし、URLを指定することもできません。

モードについては、a, a+, r, r+, w, w+の6つはPHPと同じです。
バイナリモードのbを使うこともできます。
その他のモードは少なくとも規格上は存在しません。

fopen関数の呼び出しに成功するとFILE型へのポインタを返します。
FILE型は「stdio.h」で定義されるオブジェクト型で、多くの処理系では構造体として実装されています。

fopen関数の呼び出しに失敗するとNULLを返します。

fclose関数

ファイルをクローズするには「fclose関数」を使います。
PHPにもfclose関数がありますので、使い方の説明はいらないと思います。

fclose関数は「stdio.h」ヘッダで次のように宣言されています。

int fclose(FILE *stream);

1点だけ注意が必要なのは、PHPのfclose関数は成功時にtrueを返しますが、Cのfclose関数は0を返します。
論理が逆になってしまうのでここは罠ですね。
ちなみに失敗した場合はEOFというマクロで定義されたマイナスの整数値を返します。

ファイルの読み書き

今回はファイルの読み書きの最低限の操作ができるようになるための最低限の関数を紹介することにします。

fread関数

ファイルからデータを読み込むには「fread関数」を使います。
PHPにもfread関数がありますが、Cのものとは全然使用が違うので混同しないようにしてください。

fread関数は「stdio.h」ヘッダで次のように宣言されています。

size_t fread(void * restrict ptr, size_t size, size_t nmemb, FILE * restrict stream); 

PHPのfread関数は引数が2しかありませんから全然違いますよね。
streamが最後なのも要注意です。

それからPHPでは読み込んだデータを返しますが、Cの関数は配列を返すことはできませんので引数で格納先を渡しています。
ptrがそれで、sizeバイトの要素がnmemb個の配列を渡すことになります。
最後の引数のstreamはfopen関数が返したFILE型へのポインタです。

fread関数の返却値は読み込んだバイト数ではなく要素数になります。
ここも注意ですね。

fwrite関数

ファイルを書き込むには「fwrite関数」を使います。
fread関数と同様、PHPのfwrite関数とはずいぶん違います。

fwrite関数は「stdio.h」ヘッダで次のように宣言されています。

size_t fwrite(const void * restrict ptr, size_t size, size_t nmemb, FILE * restrict stream); 

PHPのfwrite関数とは全然違いますが、Cのfread関数とは対称になっていますね。
それぞれの引数や返却値の意味も対称になっています。

Cにはほかにもファイルの読み書きを行う関数がいくつかあるんですが、今回はここまでにしておきます。


今回の解説は以上となります。
次回はファイルの操作に関してもう少し解説しようと考えています。
どうぞご期待ください!