ユーニックス総合研究所

  • home
  • archives
  • c-fopen

C言語のfopen関数でファイルを開く方法【fcloseも解説】

  • 作成日: 2022-02-09
  • 更新日: 2023-12-25
  • カテゴリ: C言語

C言語のfopen関数でファイルを開く方法

C言語ではファイルを扱うことができます。
ファイルを扱う処理をファイル入出力処理と言います。

ファイルを開くには「fopen関数」を使います。
ファイルを閉じる場合は「fclose関数」を使います。

ファイルを開いてファイルからデータを読み込んだり、ファイルを加工したりする場合は、最初にfopen関数でファイルを開く必要があります。
この記事ではfopen関数でファイルを開く方法を解説します

関連記事

自作関数read_fileでファイルを読み込み【ファイル入出力, コマンド】
目が覚めるC言語のdo-while文の使い方【ループ処理、初心者向け】
明快!C言語のcontinue文の使い方
君はまだC言語のdefineのすべてを知らない【マクロ、プリプロセス】
プログラミングのポインタをわかりやすく解説【C言語】

fopen関数の構造

fopen関数は↓のような構造になっています。

#include <stdio.h>  

FILE *fopen(const char *path, const char *mode);  

fopen関数を使うには「stdio.h」をインクルードする必要があります。
fopen関数の第1引数の「path」は開きたいファイルのパスを指定します。
第2引数の「mode」には開くときのモードを指定します。

fopen関数はpathに開きたいファイルを指定してファイルを開きます。
その時に一緒にmodeも指定する必要があります。
modeは「読み込み用」や「書き込み用」、それから「追記用」などがあります。
これは文字列で「r」とか「w」、「a」などと指定します。

fopen関数はファイルを開くのに成功するとFILE型のポインタを返します
このファイルポインタがファイルに繋がっているポインタです。
ファイル内容を読み込んだり加工したりする場合は、このファイルポインタを使います。

ファイルを開くのに失敗した場合はNULLを返します
この時にエラー内容はerrnoにセットされます。

fopen関数が返すファイルポインタは使い終わったらfclose関数で閉じる必要があります
ファイルは開いたら閉じる」というのがファイル処理の基本になります。
C言語では開いたファイルは手動で閉じる必要があるため忘れないようにしておきましょう。

fopen関数のモード

fopen関数のモードは↓の通りです。

モード文字列 意味
r または rt ファイルをテキストファイルの読み込みモードで開く。ファイルが存在しなかったらNULLを返す。
w または wt ファイルをテキストファイルの書き込みモードで開く。ファイルを空にして新規作成する。
a または at ファイルをテキストファイルの追記モードで開く。ファイルが存在しなかったら新規作成する。
rb ファイルをバイナリファイルの読み込みモードで開く。ファイルが存在しなかったらNULLを返す。
wb ファイルをバイナリファイルの書き込みモードで開く。ファイルを空にして新規作成する。
ab ファイルをバイナリファイルの追記モードで開く。ファイルが存在しなかったら新規作成する。
r+ または rt+ ファイルをテキストファイルの読み込み/書き込みモードで開く。ファイルが存在しなかったらNULLを返す。
w+ または wt+ ファイルをテキストファイルの読み込み/書き込みモードで開く。ファイルを空にして新規作成する。
a+ または at+ ファイルをテキストファイルの読み込み/追記モードで開く。ファイルが存在しなかったら新規作成する。
rb+ ファイルをバイナリファイルの読み込み/書き込みモードで開く。ファイルが存在しなかったらNULLを返す。
wb+ ファイルをバイナリファイルの読み込み/書き込みモードで開く。ファイルを空にして新規作成する。
ab+ ファイルをバイナリファイルの読み込み/追記モードで開く。ファイルが存在しなかったら新規作成する。

モードはテキストファイルを読み込みたい場合はrrtを指定します。
バイナリファイルで書き込みたい場合はwbを指定します。
このようにfopen関数のモードはファイルの種類(テキスト、バイナリ)と用途に合わせて選択します。

それぞれのモードにはファイルが存在しなかったらNULLを返したり、あるいはファイルを空にして新規作成するなどの特徴があります。
特にw などのモードはファイルを破壊的に開くので注意が必要です
まちがえて大事なファイルを空にしてしまわないようにしましょう。

fclose関数の構造

fopen関数とセットで使われるfclose関数は↓のような構造になっています。

#include <stdio.h>  

int fclose(FILE *stream);  

fclose関数も使用する場合は「stdio.h」のインクルードが必要です。
fclose関数の第1引数にはファイルポインタ(ストリーム)を渡します。
fclose関数は指定されたファイルポインタを閉じます。

fopen関数でファイルを開いたらfclose関数で閉じる
これはクセにしておきましょう。

fopen関数でテキストファイルを開く

fopen関数でテキストファイルを開く場合のコードです。
まずテキストファイルとして↓(text.txt)を用意しておきます。

Hello  
World  

それからC言語でこのテキストファイルを開くコードを書きます。

#include <stdio.h>  

int main(void) {  
    // ファイルをテキストファイルの読み込みモードで開く  
    FILE *fin = fopen("text.txt", "r");  
    if (!fin) {  
        // NULLだった場合はエラーを出力して終了  
        perror("fopen");  
        return 1;  
    }  


    // ここにファイルの読み込みや加工処理  

    // ファイルを閉じる  
    fclose(fin);  
    return 0;  
}  

fopen関数の第1引数にはファイルのパスを指定し、第2引数のモードには「r」を指定します。
r」はテキストファイルを読み込みモードで開くモードです。

fopen関数はファイルを開くのに失敗するとNULLを返します
ファイルを開くときはチェックするようにしておきましょう
エラー出力にはperror関数を使うとerrnoのエラー内容も出力してくれます。

ファイルを開いてファイルポインタを手に入れたらあとはこのポインタを使ってファイルを読み込んだり加工したりします。

ファイルポインタを使い終わったらfclose関数でファイルを閉じます。

ファイルを開きっぱなしでランチに出かけたらどうなる?

🦝 < ふんふんふん、よーしファイルを開いて、こうやっておこう

🐭 < 昼飯だ、ランチに行こうぜ

🦝 < おう

このとき、このプログラマーはファイルを開きっぱなしのプログラムを書きました。
プログラムを起動してそのままランチへ。
この場合どうなるのでしょうか?

結論から言うと、このプログラムは起動後にすぐに終了したため大事にはなりませんでした。
ほとんどの場合、ファイルを開きっぱなしにして大ごとになるケースは少ないです。

しかし、だからといってファイルを開きっぱなしにするのはよくありません
ファイルを開くためにはメモリを確保する必要があるのですが、ファイルを閉じ忘れるとこのメモリも解放されなくなってしまいます
また、ファイルを開きっぱなしにしたことでそのファイルを再度開こうとして開けなかったりなどのトラブルも生まれる可能性があります。

ファイルを開いて閉じる」というのはプログラミングをする者は誰もが知っているお作法です。
このお作法は守っておいて損はありません。

特に組み込み開発などではメモリリークはやっかいなバグになってしまいます。
ファイルはちゃんと閉じるようにしておきましょう。

おいおい、そのファイル空にしちゃっていいのかい?

fopen関数のモード「w」や「wt」、「wb」などのモードには注意が必要です。
これらのモードはファイルを空にして破壊的にファイルを開きます
大事なデータがつまっているファイルをこのモードで開かないようにしましょう。

ファイル処理で多いのがこのモード「w」に関するトラブルです。
大事なファイルを空にしてしまってデータが損失してしまった。
ということがよくあります。

趣味ならまあいいんですが仕事とかでやってしまったら、バックアップを取っていない場合はたいへんです。

w は破壊的にファイルを開く

ファイル処理ではこのことを肝に銘じておきましょう。

🦝 < ファイルを空にした数だけ強くなれる

🐭 < 失敗の経験値と言う意味で

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

モード「r」はテキストファイルを読み込みモードで開きます。
いっぽう「rb」はバイナリファイルを読み込みモードで開きます。
このテキストとバイナリの違いは何でしょうか?

主な違いは「改行」の扱いについてです。
改行には大きく分けて↓の3種類があります。

  • CR ... 古いMacなどで使われる
  • LF ... Mac/Linuxなどで使われる
  • CR + LF ... Windowsで使われる

なんと改行だけでもOSによってこんなに違いがあるのです。
モード「r」や「w」などのテキストモードはこの改行の違いを吸収してくれます。
しかしバイナリモードではこれらの改行の違いは吸収されず、そのまま扱われます。

つまり改行をお任せしたい場合はテキストモードで開き、改行を自力で扱いたい場合はバイナリモードで開くということになります。

それからバイナリモードは画像ファイルなどのテキストファイルでないファイルを開く場合に使われます。
画像ファイル内に含まれる改行に相当するデータが勝手に処理されたら困りますよね?
そのため画像ファイル、音声ファイルなどはバイナリモードで開くのが一般的です。
テキストモードはテキストファイルなどを開く場合に使われます。

そのため「勝手にいろいろ処理されたくない」場合はバイナリモードで開くと良いでしょう。

おわりに

今回はC言語のfopen関数でファイルを開く方法について解説しました。
fopen関数はファイル処理では非常によく使う関数です。
モードが多いので覚えるのが大変ですが、忘れてしまったらこの記事を参照してください。
あなたのファイル処理に幸運を。

🦝 < ファイルを扱えると出来ることが増える

🐭 < ファイル処理は必須スキル