C言語ホーム > ファイル前ページ次ページ
サイト内検索:

C言語でのファイルの扱いについて

C言語でのファイルのオープン、クローズ方法、ファイルからの読み込み、ファイルへの書き込み方法について説明しています。

ファイルのオープン

C言語でファイルを扱うには、まずファイルをオープンします。ファイルをオープンする標準ライブラリ関数はfopen()です。


#include <stdio.h>
FILE *fopen(const char *filename, const char *mode);

fopen()はfilenameで指定されたファイルをオープンし、ファイル・ポインタを返します。エラーが発生した場合はNULLが返されます。ファイル・ポインタはファイルに関する様々な情報を含む構造体へのポインタですが、使用に際して、その内容を知る必要はありません。



モードとその意味を以下に示します。

<fopenのモード>
モード意味
rテキスト・ファイルの読み込みのためにオープン。存在しなければエラー。
w書き込み用にテキスト・ファイルを作成。以前の内容は消去。
aテキスト・ファイルの終わりに追加するためにファイルをオープンまたは作成。存在しなければ新規作成。
r+読み書きのためにテキスト・ファイルをオープン。存在しなければエラー。
w+読み書きのためにテキスト・ファイルを作成。以前の内容は消去。
a+読み書きのためにテキスト・ファイルをオープンまたは作成し、その終わりに追加。存在しなければ新規作成。

"rb"や"a+b"のようにモードの最初の文字より後にbが含まれていると、ファイルをバイナリ・ファイルとしてオープンします。

読み書きのできるモード(+がついているモード)では、同じファイルの読み書きができますが、読み込みと書き込みの間にfflush()またはファイル位置付け関数をコールする必要があります。

マイクロソフトのOS上で動作するC言語処理系等では、テキスト・ファイルのモードでオープンすると、読み込み・書き込みを行う際に、自動的に改行コードの変換等をおこなう処理系もあります。UNIX系の処理系では一般的にこのような変換は起こりません。このため、UNIX上で動いていたプログラムをウィンドウズへ移植した際に、ファイルの扱いがおかしくなるという不具合がたまにあります。例えば、UNIX上でバイナリファイルをテキストモードでオープンし、書き込みなどを行うプログラムをウィンドウズへそのまま移植すると、バイナリファイルに対して改行コードの変換を行ってしまい、正しく動作しなくなる、といったようにです。UNIXでの開発時にもテキストモード、バイナリモードを意識してプログラミングするように注意しましょう。

ファイルの読み込み

<ファイルから1文字の読み込みを行う>

C言語でファイルから1文字読み込む標準ライブラリ関数はfgetc()です。


#include <stdio.h>
int fgetc(FILE *stream);

fgetc()(通称エフゲットシー)はstreamの次の文字を符号なし文字としてintに変換した上で返します。ファイルの終わり、またはエラー発生時にはEOFを返します。

<ファイルから1行の読み込みを行う>

ファイルから1行読み込む標準ライブラリ関数はfgets()です。


#include <stdio.h>
int fgets(char *s, int n, FILE *stream);

fgets()はstreamから次の最大n-1文字を配列sに読み込みます。改行があったならばそこで読み込みをストップし、配列sにデータを書き出します。この時、改行も書き出されます。fgets()はsに書き出す際に'¥0'を最後に付加します。戻り値はsですが、ファイルの終わり、またはエラー発生時にはNULLが返されます。

<ファイルから書式付きの読み込みを行う>

ファイルから書式付きで読み込む標準ライブラリ関数はfscanf()です。


#include <stdio.h>
int fscanf(FILE *stream, const char *format, ...);

fscanf()はstreamから文字を読み込み、formatで指定された形式に従って解釈し、formatの後に続く引数に結果を格納します。

formatには、フォーマット文字列(仕様はscanfと同じ)を指定します。formatの後に続く引数は結果を格納するので全てポインタとなります。戻り値は、変換に成功し、代入が行われたデータの個数です。ファイルの終わりではEOFが返されます。

fscanf()は、指定したファイルから読み込みを行うという点以外、scanf()と同じです。

<ファイルから直接の読み込みを行う>

ファイルから直接の読み込みを行う標準ライブラリ関数はfread()です。


#include <stdio.h>
size_t fread(void *ptr, size_t size, size_t n, FILE *stream);

fread()は、sizeの大きさのオブジェクトを最大n個、streamから配列ptrに読み出します。

fread()の戻り値は読み込んだオブジェクトの数です。読み込んだオブジェクトの数が要求した数より少ないこともありえます。状態を確認するには、feof()やferror()を使用します。

ファイルへの書き込み

<ファイルへ1文字の書き込みを行う>

C言語でファイルへ1文字書き込む標準ライブラリ関数はfputc()です。


#include <stdio.h>
int fputc(int c, FILE *stream);

fputc()(通称エフプットシー)は、文字cをunsigned charに変換した上でstreamに書き込みます。戻り値は出力した文字です。エラー発生時にはEOFを返します。

<ファイルへ1行の書き込みを行う>

ファイルへ1行の書き込みを行う標準ライブラリ関数はfputs()です。


#include <stdio.h>
int fputs(const char *s, FILE *stream);

fputs()は、文字列sをstreamに書き出します。文字列sは'¥n'を含む必要はありません。戻り値は負ではない値で、エラーの時はEOFを返します。

<ファイルへ書式付きの書き込みを行う>

ファイルへ書式付きで書き込みを行う標準ライブラリ関数はfprintf()です。


#include <stdio.h>
int fprintf(FILE *stream, const char *format, ...);

fprintf()はstreamに対してformatで指定したフォーマットでデータを書き込む関数です。フォーマットの仕様はprintf()と同じです。戻り値はfprintf()が書き込んだ文字数です。エラー発生の場合は負の数が返されます。

fprintf()は、指定したファイルへ書き込みを行うという点以外、printf()と同じです。

<ファイルへ直接の書き込みを行う>

ファイルに対して直接の書き込みを行う標準ライブラリ関数はfwrite()です。


#include <stdio.h>
size_t fwrite(const void *ptr, size_t size, size_t n, FILE *stream);

fwrite()は、sizeの大きさのオブジェクトをn個、配列ptrからstreamに書き出します。

fwrite()の戻り値は書き込んだオブジェクトの数です。エラーが起こると書き込んだオブジェクト数である戻り値が第三引数のn個より小さくなります。

ファイルのクローズ

ファイルを使い終えたらクローズします。C言語でファイルをクローズする標準ライブラリ関数はfclose()です。


#include <stdio.h>
int fclose(FILE *stream);

fclose()は、バッファリングされてまだ書き出されていないデータをstreamに書き出し、まだ読み込まれていないバッファ内の入力を破棄し、自動的に割り当てられたバッファをすべて解放した上で、ファイルをクローズします。成功した場合、戻り値は0で、エラーが発生した場合はEOFが返されます。

またfclose()は、プログラムが正常に終了する時に、オープンされている各ファイルそれぞれに対して、自動的に呼び出されます。

ファイルの削除

C言語でファイルの削除を行う標準ライブラリ関数はremove()です。


#include <stdio.h>
int remove(const char *filename);

remove()は、指定されたファイルを削除します。削除に成功すると0を返します。エラーが発生した場合は0ではない値を返します。

C言語ホーム > ファイル前ページ次ページ
© 2009 C言語サイト管理人