データの入出力において、1文字ごとの入出力関数の呼び出しのたびに入出力装置を駆動したり、OSの機能を呼び出していたのでは、効率が悪くなります。そこで、通常はバッファと呼ばれる記憶域を用意しておき、バッファ内のデータに対して一括して入出力を行います。
一方、プログラムの側から見ると、1文字ごとに入出力関数を呼び出せた方が便利です。
ライブラリ関数では、バッファの管理を自動的に行うことにより、プログラム内でバッファの状態を意識することなしに、1文字単位の入出力を効率よく行うことができます。
このように、データの入出力を効率よく実現するために詳細な手段を意識せず、入出力をひとつのデータの流れ(ストリーム)と考えてプログラムを作ることのできる機能をストリーム入出力といいます。
ストリーム入出力に必要なバッファやその他の情報は、一つの構造体の中に記憶されており、標準インクルードファイル<stdio.h>の中でFILEという名前で定義されています。
ストリーム入出力においては、ファイルはすべてFILE構造体のデータ構造を持つものとして扱います。このようなファイルをストリームファイルと呼びます。このファイル構造体へのポインタをファイルポインタと呼び、入出力ファイルを指定するために用います。
fopen関数等でファイルをオープンすると、ファイルポインタが得られますが、オープン処理が失敗するとNULLが返ってきます。NULLポインタを、他のストリーム入出力関数に指定すると、その関数は異常終了しますので、注意が必要です。ファイルをオープンした時は、必ずファイルポインタの値をチェックするようにしてください。
ライブラリ関数の実現方法としては、関数とマクロの二通りがあります。
関数は、通常のユーザ作成の関数と同じインタフェースを持ち、リンク時に取り込みます。
マクロは、その関数に関連した標準インクルードファイルの中で#define文を用いて定義されています。
パラメータの絶対値を求めるMACROを以下のようにマクロ定義します。
#define MACRO(a) ((a)>=0?(a):-(a))
と展開され、aは2回インクリメントされることになり、また結果の値も最初のaの値の絶対値とは異なります。
getc関数、getchar関数、fgetc関数等のファイルからデータを入力する関数において、ファイル終了(End Of File)時に返される値です。EOFは、標準インクルードファイル<stdio.h>の中で定義されています。
ポインタが何も指していない時の値です。NULLは、標準インクルードファイル<stddef.h>の中で定義されています。
C/C++言語における文字列の終わりは、文字"\0"によって示されることになっています。
ライブラリ関数における文字列のパラメータも、すべてこの約束に従っていなければなりません。
この文字列の終わりを示す文字"\0"を以下ヌル文字と呼びます。
ライブラリ関数の中には、リターン値によって、指定された処理が成功したか、失敗したか等の結果を判断するものがあります。
このような場合のリターン値を特にリターンコードと呼びます。
多くのシステムでは、データを格納するために特殊なファイル形式を持っています。
これをサポートするために、ライブラリ関数にはテキストファイルとバイナリファイルの2種類のファイル形式があります。
テキストファイルは、通常のテキストを格納するためのファイルで、行の集まりとして構成されています。テキストファイルの入力の時、行の区切りとして改行文字("\n")が入力されます。また、出力の時、改行文字を出力することにより、現在の行の出力を終了します。テキストファイルは、処理系ごとの標準的なテキストを格納するファイルの入出力を行うためのファイルです。テキストファイルでは、ライブラリ関数で入出力する文字は必ずしもファイル内の物理的なデータの並びと対応していません。
バイナリファイルは、バイトデータの列として構成されているファイルです。ライブラリ関数で入出力するデータは、ファイル内の物理的なデータの並びと対応しています。
入出力のライブラリ関数で、ファイルのオープン等の準備を行わずに標準的に使用できるファイルを標準入出力ファイルといいます。標準入出力ファイルには、標準入力ファイル(stdin)、標準出力ファイル(stdout)、標準エラー出力ファイル(stderr)があります。
プログラムからのエラーメッセージ等の出力を行うための標準的なファイルです。
浮動小数点型は、実数を近似して表現したものです。C/C++言語のソースプログラム上では浮動小数点型を10進数で表現していますが、計算機の内部では通常2進数で表現されます。
2進数の場合の浮動小数点型の表現は次のようになります。
ここでnを浮動小数点型の指数部、mを仮数部といいます。浮動小数点型を一定のデータサイズで表現するために、nとmのビット数は通常固定されています。
以下、浮動小数点型に関する用語を説明します。
浮動小数点型が何進数で表現されているかを示す整数値です。通常、基数は2です。
浮動小数点型よりも精度の高い演算の途中結果を浮動小数点型に格納する場合に丸めが行われます。丸めには、切り上げ、切り捨て、四捨五入(2進小数の場合は、0捨1入となります)があります。
浮動小数点型を、2n×mの形式で表現する場合、同一の数値を表す異なる表現が可能です。
通常は、有効桁数を確保するために、先頭の桁が0でないような表現を用います。これを正規化された浮動小数点型といい、浮動小数点型をこのような表現に変換する操作を正規化といいます。
浮動小数点型の演算の途中結果を保持する場合、通常は、丸めを行うために実際の浮動小数点型よりも1ビット多いデータを用意します。しかし、これだけでは桁落ち等が生じた時に正確な結果を求めることができません。このために、もう1ビット設けて演算の途中結果を保持する手法があります。このビットをガードビットといいます。
ファイルをオープンする時にどのような処理をファイルに行うかを示す文字列です。文字列の種類には表 7.1に示す12種類があります。
ストリームファイルごとに、ファイルの入出力の際にエラーが生じたかどうかを示すエラー指示子と、入力ファイルが終了したかどうかを示すファイル終了指示子というデータを保持しています。
これらのデータは、それぞれferror関数、feof関数によって参照することができます。
ストリームファイルを扱う関数のうち、そのリターン値だけからではエラーの発生やファイルの終了の情報が得られないものがあります。エラー指示子とファイル終了指示子は、このような関数の実行後にファイルの状態を調べるために使用することができます。
ディスク上のファイル等、ファイル内の任意の位置からの読み書きができるストリームファイルは、現在読み書きしているファイル内の位置を示すデータを保持しています。これを位置指示子といいます。端末装置等、ファイル内の読み書きの位置を変更できないストリームファイルでは、位置指示子は使用しません。