【課題5−3 ファイル入出力の基本】

 

<ファイル入出力>

メモリー上のデータをファイルに書き出す.ファイルの中身をメモリに読み込む.

 

<ストリーム>

Cプログラムとファイルを結ぶデータの流れ.プログラムでファイルをオープンすると,プログラムとファイルの間にストリームが確立され,このストリーム上に入出力のためのバッファがおかれる.ファイル入出力を行うには,まずファイルオープンによって,このストリームを確立しなくてはならない.

 

<標準ストリーム>

キーボード,画面といった出力デバイスも「ファイル」として扱われる.それらを示すポインタとして標準ストリームがあり,これらはプログラム実行時に自動的にオープンされる特別なファイルである.

ファイルポインタ

機能

デバイス

stdin

標準入力

通常はキーボード

stdout

標準出力

通常はモニタ画面

stderr

標準エラー出力

通常はモニタ画面

 

例えばprintfは,ファイルに書き出す関数fprintf(後述)の書き込み先にstdoutを指定したのと全く同じである.fprintfstderrを指定した場合もprintfと同様に画面に書き出すが,stdoutに対して行った出力はリダイレクトされるのに対し,stderrに対して行った出力はリダイレクトされない,という違いがある.

 

<ファイル入出力の手順>

ディスク上のファイルに対する入出力は,必ず,ファイルをオープンしてストリームと結合する手続きと,使い終わったファイルをクローズしてストリームから切り離す手続きが必要.

 

<ファイル操作手順>

1.ファイルポインタの宣言

(例)  FILE *fin, *fout;

ファイルポインタを,FILE型構造体へのポインタとして宣言する.FILE型構造体はstdin.hで宣言されており,その内容は処理系に依存するが,以下のような,ファイル入出力に必要不可欠な情報を管理している.

・ファイル位置指示子:現在のアクセス位置

・ファイル終了指示子:ファイルの終端に達したか

・エラー指示子:エラー情報

・関連するバッファへのポインタ:fopenによってこのポインタが取得される.

 

2.ファイルのオープン

fopenを使う.ファイルとストリームを結合し,ファイルポインタを返す.ファイルのオープンは,読み込みや書き込みなどのファイルの扱いを,モードで指定して行う.存在しないファイルに対して読み込みモードでオープンしようとした場合など,オープン操作に失敗すると,fopenNULLを返す.必ずNULLの判定を行い,NULLが返された場合にはエラー処理を行うようにする.

 

3.ファイルへの入出力

fgetcfputcなど多くの標準関数がある(後述).

 

4.ファイルのクローズ

ファイルの使用が終了したら,fclose関数を用いてファイルとストリームとを切り離す.

 

<ファイル入出力に関連する標準関数>

fopen関数:ファイルのオープン

形式: FILE *fopen(const char *filename, const char *mode);

機能: ファイル名fileのファイルを指定モードmodeでオープンする.

返値: 正常時:ファイルポインタ

       異常時:NULL

モード

内容

ファイルがあるとき

ファイルがないとき

"r"

読み込み専用

正常

エラー(NULL返却)

"w"

書き込み専用

サイズを0にする(上書き)

新規作成

"a"

追加読み込み専用

最後に追加する

新規作成

"r+"

読み込みと書き込み

正常

エラー(NULL返却)

"w+"

書き込みと読み込み

サイズを0にする(上書き)

新規作成

"a+"

読み込みと追加書き込み

最後に追加する

新規作成

バイナリモードで開くときは"rb","w+b"のように"b"を付加する.省略するとテキストモード.

 

fclose関数:ファイルのクローズ

形式: int close(FILE *fp);

機能: fopenでオープンされた,fpで示されるファイルをクローズする.

返値: 正常時:0

       異常時:EOF

 

fgetc関数:ファイルから1文字読み込み

形式: int fgetc(FILE *fp);

機能: fpがさすファイルから1文字読み込む.その際ファイル位置指示子を進める.

返値: 正常時:読みこんだ文字(unsigned charからintに変換されている)       ファイル終了時および異常時:EOF

 

fputc関数:ファイルへ1文字書き込み

形式: int fputc(int c, FILE *fp);

機能: fpが指すファイルへ文字cintからunsigned charに変換して書き込み,ファイル位置指示子を進める.

返値: 正常時:出力した文字

       異常時:EOF

 

fgets関数:ファイルから文字列を読み込み

形式: char *fgets(char *s, int n, FILE *fp);

機能: fpが指すファイルから文字列を読み込み,sが指す配列に格納する.最大も字数としてnを指定する.この文字数には'¥0'も含まれるので,実際に入力できる文字数はn-1になる.また,改行も読み込む.

返値: 正常時:s

       ファイル終了時および異常時:NULL

 

fputs関数:ファイルへ文字列を書き込み

形式: int fputs(const char *s, FILE *p);

機能: fpが指すファイルへ文字列sを出力する.'¥0'は書き込まない.また改行は付加しない.

返値: 正常時:非負

       異常時:EOF

 

fscanf関数:ファイルから書式付きで読み込み

形式: int fscanf(FILE *fp, const char *format, ...);

機能: fpが指すファイルから書式付きで入力する.ファイルポインタを指定できる以外はscanfと同じ.

返値: 正常時:入力項目数

       異常時:EOF

 

fprintf関数:ファイルへ書式付きで書き込み

形式: int fprintf(FILE *fp, const char *format, ...);

機能: fpが指すファイルへ書式付きで出力する.ファイルポインタを指定できる以外はprintfと同じ.

返値: 正常時:転送バイト数

       異常時:負値

 

 

戻る