【課題5−3 ファイル入出力の基本】
<ファイル入出力>
メモリー上のデータをファイルに書き出す.ファイルの中身をメモリに読み込む.
<ストリーム>
Cプログラムとファイルを結ぶデータの流れ.プログラムでファイルをオープンすると,プログラムとファイルの間にストリームが確立され,このストリーム上に入出力のためのバッファがおかれる.ファイル入出力を行うには,まずファイルオープンによって,このストリームを確立しなくてはならない.
<標準ストリーム>
キーボード,画面といった出力デバイスも「ファイル」として扱われる.それらを示すポインタとして標準ストリームがあり,これらはプログラム実行時に自動的にオープンされる特別なファイルである.
ファイルポインタ |
機能 |
デバイス |
stdin |
標準入力 |
通常はキーボード |
stdout |
標準出力 |
通常はモニタ画面 |
stderr |
標準エラー出力 |
通常はモニタ画面 |
例えばprintfは,ファイルに書き出す関数fprintf(後述)の書き込み先にstdoutを指定したのと全く同じである.fprintfにstderrを指定した場合もprintfと同様に画面に書き出すが,stdoutに対して行った出力はリダイレクトされるのに対し,stderrに対して行った出力はリダイレクトされない,という違いがある.
<ファイル入出力の手順>
ディスク上のファイルに対する入出力は,必ず,ファイルをオープンしてストリームと結合する手続きと,使い終わったファイルをクローズしてストリームから切り離す手続きが必要.
<ファイル操作手順>
1.ファイルポインタの宣言
(例) FILE
*fin, *fout;
ファイルポインタを,FILE型構造体へのポインタとして宣言する.FILE型構造体はstdin.hで宣言されており,その内容は処理系に依存するが,以下のような,ファイル入出力に必要不可欠な情報を管理している.
・ファイル位置指示子:現在のアクセス位置
・ファイル終了指示子:ファイルの終端に達したか
・エラー指示子:エラー情報
・関連するバッファへのポインタ:fopenによってこのポインタが取得される.
2.ファイルのオープン
fopenを使う.ファイルとストリームを結合し,ファイルポインタを返す.ファイルのオープンは,読み込みや書き込みなどのファイルの扱いを,モードで指定して行う.存在しないファイルに対して読み込みモードでオープンしようとした場合など,オープン操作に失敗すると,fopenはNULLを返す.必ずNULLの判定を行い,NULLが返された場合にはエラー処理を行うようにする.
3.ファイルへの入出力
fgetcやfputcなど多くの標準関数がある(後述).
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が指すファイルへ文字cをintから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と同じ.
返値: 正常時:転送バイト数
異常時:負値