C言語のfopen関数でファイルを開く方法【fcloseも解説】
目次
- C言語のfopen関数でファイルを開く方法
- fopen関数の構造
- fopen関数のモード
- fclose関数の構造
- fopen関数でテキストファイルを開く
- ファイルを開きっぱなしでランチに出かけたらどうなる?
- おいおい、そのファイル空にしちゃっていいのかい?
- テキストモードとバイナリモードの違い
- おわりに
C言語のfopen関数でファイルを開く方法
C言語ではファイルを扱うことができます。
ファイルを扱う処理をファイル入出力処理と言います。
ファイルを開くには「fopen関数」を使います。
ファイルを閉じる場合は「fclose関数」を使います。
ファイルを開いてファイルからデータを読み込んだり、ファイルを加工したりする場合は、最初にfopen関数でファイルを開く必要があります。
この記事ではfopen関数でファイルを開く方法を解説します。
関連記事
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+ |
ファイルをバイナリファイルの読み込み/追記モードで開く。ファイルが存在しなかったら新規作成する。 |
モードはテキストファイルを読み込みたい場合はr
かrt
を指定します。
バイナリファイルで書き込みたい場合は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関数でファイルを閉じます。
ファイルを開きっぱなしでランチに出かけたらどうなる?
(^ _ ^) | ふんふんふん、よーしファイルを開いて、こうやっておこう |
(・ v ・) | 昼飯だ、ランチに行こうぜ |
(^ _ ^) | おう |
このとき、このプログラマーはファイルを開きっぱなしのプログラムを書きました。
プログラムを起動してそのままランチへ。
この場合どうなるのでしょうか?
結論から言うと、このプログラムは起動後にすぐに終了したため大事にはなりませんでした。
ほとんどの場合、ファイルを開きっぱなしにして大ごとになるケースは少ないです。
しかし、だからといってファイルを開きっぱなしにするのはよくありません。
ファイルを開くためにはメモリを確保する必要があるのですが、ファイルを閉じ忘れるとこのメモリも解放されなくなってしまいます。
また、ファイルを開きっぱなしにしたことでそのファイルを再度開こうとして開けなかったりなどのトラブルも生まれる可能性があります。
「ファイルを開いて閉じる」というのはプログラミングをする者は誰もが知っているお作法です。
このお作法は守っておいて損はありません。
特に組み込み開発などではメモリリークはやっかいなバグになってしまいます。
ファイルはちゃんと閉じるようにしておきましょう。
おいおい、そのファイル空にしちゃっていいのかい?
fopen関数のモード「w
」や「wt
」、「wb
」などのモードには注意が必要です。
これらのモードはファイルを空にして破壊的にファイルを開きます。
大事なデータがつまっているファイルをこのモードで開かないようにしましょう。
ファイル処理で多いのがこのモード「w
」に関するトラブルです。
大事なファイルを空にしてしまってデータが損失してしまった。
ということがよくあります。
趣味ならまあいいんですが仕事とかでやってしまったら、バックアップを取っていない場合はたいへんです。
「w は破壊的にファイルを開く」
ファイル処理ではこのことを肝に銘じておきましょう。
(^ _ ^) | ファイルを空にした数だけ強くなれる |
(・ v ・) | 失敗の経験値と言う意味で |
テキストモードとバイナリモードの違い
モード「r
」はテキストファイルを読み込みモードで開きます。
いっぽう「rb
」はバイナリファイルを読み込みモードで開きます。
このテキストとバイナリの違いは何でしょうか?
主な違いは「改行」の扱いについてです。
改行には大きく分けて↓の3種類があります。
CR ... 古いMacなどで使われる
LF ... Mac/Linuxなどで使われる
CR + LF ... Windowsで使われる
なんと改行だけでもOSによってこんなに違いがあるのです。
モード「r
」や「w
」などのテキストモードはこの改行の違いを吸収してくれます。
しかしバイナリモードではこれらの改行の違いは吸収されず、そのまま扱われます。
つまり改行をお任せしたい場合はテキストモードで開き、改行を自力で扱いたい場合はバイナリモードで開くということになります。
それからバイナリモードは画像ファイルなどのテキストファイルでないファイルを開く場合に使われます。
画像ファイル内に含まれる改行に相当するデータが勝手に処理されたら困りますよね?
そのため画像ファイル、音声ファイルなどはバイナリモードで開くのが一般的です。
テキストモードはテキストファイルなどを開く場合に使われます。
そのため「勝手にいろいろ処理されたくない」場合はバイナリモードで開くと良いでしょう。
おわりに
今回はC言語のfopen関数でファイルを開く方法について解説しました。
fopen関数はファイル処理では非常によく使う関数です。
モードが多いので覚えるのが大変ですが、忘れてしまったらこの記事を参照してください。
あなたのファイル処理に幸運を。
(^ _ ^) | ファイルを扱えると出来ることが増える |
(・ v ・) | ファイル処理は必須スキル |