Cの標準ライブラリを通じてファイルの入出力を行う場合は, ハードウェアの実態を意識せずに, 以下のイラストのような抽象的なイメージで取り扱うことができる.
Cの標準ライブラリでは, ファイルの入出力をstdio.hの中で定義されているFILE型へのポインタを目印にして行う. そこで,
FILE *fp1, *fp2;というようなポインタ変数の用意し,fp1やfp2という変数(の中身)で, 入出力の相手を区別する.
ファイルに対して入出力を行うには,必ず最初にファイルを「オープン」し, 書いたり読んだりが終わったら,必ず「クローズ」する必要がある. それを行うのが標準ライブラリの中の関数 fopenとfcloseである. fopenはオープンの処理が成功すると, そのファイルに対するファイルポインタを返してくれる.
実は,標準ライブラリには, fopenしなくても最初から使えるようになっているファイルポインタが3つ用意されており, stdin, stdout, stderrという名前で宣言されている. それぞれ,「標準入力」「標準出力」「標準エラー出力」と呼ばれている. これらは,デフォルトでは,stdinはキーボードに, stdoutとstderrは画面に割り付けられている.キーボードからの文字入力や, 画面への文字出力も, ファイルに対する入出力と同じ手続きで行えるように仕組まれている.
Cの標準ライブラリの中のファイル入出力関係の重要な関数を挙げる.
ファイル名で指定されるファイルに対して入出力できるように準備する.
モードの基本は,"r"(読み込み)か"w"(書出し).
返り値は,ファイルポインタ(入出力の相手を区別する目印).
これがNULL(特殊なポインタ値)の場合は,処理に失敗を意味する.
ファイルの後始末.
printfのファイル版.
書式文字列以降の使い方はprintfと全く同じ
scanfのファイル版.あまり使うべきではない.
文字配列に1行分(改行文字も含む)の文字を読み込む.
返り値は,文字配列を指すポインタ.
これがNULLだとファイルの終りを意味する.
用意した配列の大きさをオーバしないように要素数を与える.
最大文字数はnum-1.残り1は'\0'の分.
scanfの文字列版.
文字配列strを先頭から走査し,書式文字列で指定された内容を読み取り,
それぞれの型に変換する.
返り値は読み込みに成功した項目数.
文字配列の内容をfpで示されるファイルに書く.
この演習では積極的には取り上げないが, ファイルに対する読み書きの基本となる関数がこの2つである. fputcは1文字書く.fgetcは1文字読む. 文字列単位の操作を行う関数は,全てこれらの関数でできている.
FILE *fp; ファイルポインタの変数宣言 fp = fopen("aaa.dat", "w"); ファイルを準備し得られたポインタ値を代入 fprintf(fp, "%9.6f %9.6f\n", t, x); 数値を表す文字列の出力 fclose(fp); 後始末
FILE *fp; ファイルポインタの変数宣言 fp = fopen("aaa.dat", "r"); ファイルを準備し得られたポインタ値を代入 fscanf(fp, "%f", &x); ファイルを走査し数値に変換 fclose(fp); 後始末
FILE *fp; ファイルポインタの変数宣言 char buffer[BSIZE]; ファイルから読み出した文字列を入れる配列 fp = fopen("aaa.dat", "r"); ファイルを準備し得られたポインタ値を代入 fgets(buffer, BSIZE, fp); 1行の内容を文字配列に格納 (下図参照) sscanf(buffer, "%f%f", &t, &x); 文字列を走査し数値に変換 fclose(fp); 後始末
fgetsの働き