C言語入門|ファイル操作の4ステップと基本関数

いよいよファイル操作に挑戦

おまっとさん!
ここからはいよいよ ファイルを直接操作する世界 に足を踏み入れます。

画面に文字を表示したり、キーボードから入力を受け取ったりするだけでなく、
プログラムの外にあるファイルを読み書きできるようになると、
できることが一気に広がります。

とはいえ、C言語のファイル操作には「お作法」があります。
まずはその全体像をしっかり押さえておきましょう。

ファイル操作は必ず4ステップ

C言語では、ファイルの読み書きを 次の4つのステップ で行います。

ステップ内容役割
FILE構造体へのポインタを宣言準備
ファイルを開く準備
読み書きするメイン処理
ファイルを閉じる後片付け

このうち、本当にやりたい処理は➂ ですが、
それを安全に行うために、前後の準備と後片付けが欠かせません。

料理に例えるなら、

  • ファイルを開く → 包丁とまな板を用意する。
  • 読み書きする → 調理する。
  • ファイルを閉じる → 洗い物をする。

という感じです。

FILE構造体とファイルポインタ

ファイル操作の主役となるのが FILE構造体 です。

FILE構造体とは

FILE構造体は、次のような情報をまとめて管理するための構造体です。

  • ファイルのアクセスモード
  • 現在の読み書き位置
  • エラー状態
  • 内部バッファの情報

ただし、
中身を直接操作することはありません。

私たちは、この構造体へのポインタを使って、
標準ライブラリの関数に処理を任せます。

ファイルポインタ

FILE構造体へのポインタは、一般に ファイルポインタ と呼ばれます。

FILE* fp;

この fp を、
読み書き関数・閉じる関数に必ず渡すことになります。

fopen ― ファイルを開く

ファイル操作は、まず ファイルを開く ところから始まります。

fopen の書式

FILE* fopen(const char* filename, const char* mode)
引数意味
filename開きたいファイル名(相対パスまたは絶対パス)
modeアクセスモード
戻り値成功時はファイルポインタ、失敗時は NULL

fopen の役割

fopen は、

  • 指定したファイルを
  • 指定したモードで開き
  • ファイル操作に必要な情報を初期化する。

という仕事を行います。

もしファイルを開けなかった場合は、
NULL が返る ため、必ずチェックが必要です。

アクセスモードの考え方

ファイルは「どう使うか」を指定して開きます。
これを アクセスモード といいます。

テキストファイルの主なモード

モード意味ファイルが存在しない場合
r読み取り専用エラー
w書き込み専用新規作成
a追加書き込み新規作成
r+読み書きエラー
w+読み書き新規作成
a+読み取り+追加新規作成

バイナリファイルのモード

テキストモードの末尾に b を付けます。

意味
rbバイナリ読み取り
wbバイナリ書き込み
abバイナリ追加

テキストとバイナリの違い

両者の違いは 改行コードの扱い だけです。

  • テキストモード
    → OSに応じて改行コードを自動変換
  • バイナリモード
    → データをそのまま扱う

内容をそのまま扱いたい場合は、バイナリモードを使います。

fclose ― ファイルを閉じる

ファイルを使い終わったら、必ず 閉じる 必要があります。

fclose の書式

int fclose(FILE* fp)
戻り値意味
0正常終了
EOFエラー

fclose の役割

fclose は、

  • ファイルとの接続を解除し
  • 内部バッファをフラッシュし
  • OSにファイルを返却する。

という重要な後片付けを行います。

注意点

  • fp が NULL の状態で fclose を呼ぶ動作は保証されない
  • fopen に失敗した場合は fclose を呼ばない

という点には注意してください。

exit によるエラー処理

ファイル操作では、
「ファイルを開けなかった」
という状況が必ず発生します。

その場合は、処理を続行せず 即終了 するのが安全です。

exit(1);

exit に 0 以外の値を渡すことで、
「このプログラムは異常終了した」
という情報をOSに伝えることができます。

ファイルの閉じ忘れに注意

初心者が最もやってしまいがちなのが、
ファイルの閉じ忘れ です。

閉じ忘れの問題点

問題内容
ファイル占有他のプログラムが使えなくなる。
リソース枯渇同時に開けるファイル数に制限がある。
不具合調査が困難原因がわかりにくい。

正常終了時だけでなく、
エラー発生時にも確実に fclose が呼ばれるように
制御を書くことが重要です。

次に進む前に覚えておくこと

この節で押さえておきたいポイントは次の3つです。

  • ファイル操作は必ず4ステップ
  • FILE構造体は直接触らない。
  • 開いたファイルは必ず閉じる。

次の節からは、
実際に読み書きする関数群 をひとつずつ紹介していきます。