C言語でファイル操作を行うときに登場するファイルポインタは、初心者がつまずきやすい概念のひとつです。特に、他のプログラミング言語のようにオブジェクトがメソッドを持つ仕組みとは異なるため、「ファイルポインタにはどんなメソッドがあるのか」と疑問に感じることがあります。
C言語のFILE型はメソッドを持つオブジェクトではありません。その代わりに、FILE構造体を指すポインタを利用し、専用の標準ライブラリ関数を呼び出してファイルの読み書きを行います。この記事では、ファイルポインタの仕組みや関連する代表的な関数について詳しく解説します。
C言語のファイルポインタとは何か
C言語では、ファイルを扱うためにFILE型というデータ型が用意されています。ファイルポインタとは、このFILE型を指すポインタ変数のことです。
例えば、ファイルを開くときにはfopen関数を使用し、戻り値としてFILE型へのポインタを受け取ります。
FILE *fp;
fp = fopen("sample.txt", "r");
このfpがファイルポインタです。プログラムはこのポインタを通して、読み込み位置やファイル状態などの情報を管理します。
C言語のFILE型にはメソッドは存在しない
C++やJavaなどのオブジェクト指向言語では、オブジェクトが自身のデータを操作するメソッドを持っています。しかし、C言語の構造体やポインタにはメソッドという概念はありません。
そのため、C言語ではFILEポインタに対して関数を呼び出す形で操作します。例えば、ファイルを閉じる場合はfp.close()のような記述ではなく、fclose(fp)という関数を使用します。
つまり、C言語では「ファイルポインタがメソッドを持つ」のではなく、「ファイルポインタを引数として渡す関数によって操作する」という設計になっています。
ファイルポインタで使用する代表的な関数
ファイルポインタを利用する代表的な関数には、ファイルの開閉、読み込み、書き込み、位置変更などがあります。
| 関数 | 役割 |
|---|---|
| fopen | ファイルを開く |
| fclose | ファイルを閉じる |
| fgetc | 1文字読み込む |
| fputc | 1文字書き込む |
| fgets | 1行読み込む |
| fputs | 文字列を書き込む |
| fread | バイナリデータを読み込む |
| fwrite | バイナリデータを書き込む |
| fseek | ファイル位置を変更する |
| ftell | 現在位置を取得する |
これらの関数はすべてFILEポインタを受け取り、そのファイルに対する処理を実行します。
ファイルを開くfopen関数
fopen関数は、ファイル操作の開始時に使用します。ファイル名とモードを指定すると、操作対象となるファイルポインタが返されます。
FILE *fp;
fp = fopen("data.txt", "r");
第2引数には操作モードを指定します。代表的なモードには以下があります。
- “r”:読み込み専用
- “w”:書き込み専用(既存内容を削除)
- “a”:追記用
- “rb”:バイナリ読み込み
- “wb”:バイナリ書き込み
ファイルを開いた後は、必ずfclose関数で閉じることが重要です。
ファイルを閉じるfclose関数
fclose関数は、開いたファイルを解放するために使用します。
fclose(fp);
ファイルを閉じないままプログラムを終了すると、データが正しく保存されなかったり、使用できるファイル数の上限に達したりする可能性があります。
例えば、文章を書き込むプログラムでは、fputsなどでデータを書き込んだ後にfcloseを実行することで、安全に保存処理を完了できます。
ファイルの読み書きを行う関数
文字データを扱う場合にはfgetc、fputc、fgets、fputsなどが利用されます。
例えば、テキストファイルから1行ずつ読み込む場合はfgetsを使用します。
char buffer[100];
fgets(buffer, 100, fp);
一方、大量のデータや画像ファイルなどのバイナリデータを扱う場合にはfreadやfwriteを使用します。
ファイル位置を操作する関数
ファイルを読み書きすると、ファイル内部の現在位置を示すファイルポジションが移動します。この位置を操作するためにfseekやftellを使用します。
fseekを利用すると、ファイルの途中から読み込みを開始するといった処理が可能になります。
fseek(fp, 0, SEEK_END);
例えば、大きなファイルの特定部分だけを読み込むプログラムでは、fseekによる位置移動が役立ちます。
C言語とC++のファイル操作の違い
C++ではifstreamやofstreamなどのクラスを利用し、オブジェクトのメソッドとしてファイル操作を行います。
一方、C言語ではFILEポインタと関数を組み合わせて操作します。この違いは、C言語が手続き型言語として設計されていることが理由です。
例えばC++ではstreamオブジェクトに対してreadやwriteを呼び出しますが、C言語ではfreadやfwriteにFILEポインタを渡します。
まとめ
C言語のファイルポインタには、C++やJavaのようなメソッドは存在しません。FILE型へのポインタを利用し、標準ライブラリ関数によってファイル操作を実行します。
代表的な関数にはfopen、fclose、fgets、fputs、fread、fwrite、fseekなどがあり、それぞれファイルの開閉や読み書き、位置操作を担当しています。
ファイルポインタの仕組みを理解すると、C言語でのファイル処理の基本的な考え方が分かり、より安全で効率的なプログラムを作成できるようになります。


コメント