この記事は、データ型 からの続編です。
この記事は、絵でわかる プログラムとは何か(5)~データ~ の一記事です。
この記事のポイント
- ファイルをロードするには、オープンシステムコールでファイル名とオープンモードを指定する。
- オープンモードには、読み取り(Read)/上書き(Write)/追記(Append) 、およびバイナリ(Bynary)と更新(+) がある。
- 今、ファイルがロードされているメモリ領域を、ストリーム(stream)と言う。
- 標準入力/標準出力/標準エラー出力 を標準ストリームと言う。
- 入出力の進行状況に応じて、段階的に中身を入れ替えていくメモリの一時領域をバッファと言う。
- オープンシステムコールの戻り値には、FILE型を参照するファイルポインタが入る。
- FILE型には、ストリームへの参照が入っている。
- オープンに失敗した時は、戻り値にはNULLポインタが入る。
- ストリーム(バッファ)の内容をストレージへ一気に反映させる処理を、フラッシュ(flush)と言う。
- ファイルの使用後は、クローズシステムコールでメモリを開放する。
ファイルのオープン
プログラムでファイルを扱うためには、まず、プログラムからシステムコールを使って、ファイルの中身をメモリにロードしておく処理が必要になります。この処理をファイルのオープン(open)と言います。
ファイルをオープンするシステムコールでは、ファイル名 と オープンモード を指定します。
ソースコード中での記述イメージ: open ( ファイル名 , オープンモード )
オープンモード
オープンモードとは読み/書きの制限のことで、以下の3種のモードを組み合わせて指定します。(例:RB+ = 読み書き併用バイナリモード)
R / W / A モード
- R
- 読み取り(Read)モード
- W
- 上書き(Write)モード(元の中身を削除して新規書き込み)
- A
- 追記(Append)モード(元の中身は削除されず末尾へ書き込み)
上書きと追記をまとめて「書き込み」と言い、さらに読み取りもまとめて「読み書き」と言います。
B モード
- B
- バイナリ(Binary)モード(通常、バイト単位で読み書き)
- 省略
- テキストモード(通常、行や文字単位で読み書き)
+ モード
- +
- 更新モード(読み書き併用)
- 省略
- 専用モード(読み取り専用/書き込み専用)
ストリーム
オープンによって、今、ファイルがロードされているメモリ領域を、ストリーム(stream)と言います。
ストリームでは、バイト単位や文字単位など、細かいデータ単位での逐次処理が可能になっています。
プログラムのロード時に、すでにロードされているファイルは、ストリームではありません。(OSがオープンする標準ストリームを除く)
プログラム実行中(runtime)に、オープンを実行(execute)してロードされたファイルだけ、ストリームになります。
英語の stream は本来「続く流れ」と言う意味で、ストリームは、終わりが見えない現在進行形のデータ入出力にも対応します。
多くのOSにおいて、キーボードやディスプレイまで含め、入出力装置が扱うデータは全て、ファイルと同等に扱われ、ストリームになります。
特に、標準入力(キーボード)/標準出力(成功時:ディスプレイ-バッファ有り)/標準エラー出力(失敗時:ディスプレイ-バッファ無し) に対応する各ストリームを、標準ストリームとも言います。
バッファ(buffer)
終わりが見えない現在進行形のデータ入出力にも対応するため、ストリームでは、ファイルの最後まで一気にではなく、プログラムからの読み書き状況や入出力状況に応じて、段階的に中身を入れ替えていく読み書き方式(バッファリング:buffering)ができるようになっています。
bufferとはショック吸収のための余地のことです。プロセッサと入出力機器との間で、ストリームが治水用のため池のようになり、一気にデータが入ってきてあふれたり、急に流すデータが無くなったりするのを防ぐ役割を果たす様子を、バッファと言っています。
高速で読み書きできるメモリに、十分余裕を持ったバッファ領域を確保することで、トラブルの予防になります。
ファイルオープンのリターン(戻り)
システムコールによるオープンが終了すると、元のプログラムへ、あるメモリ領域への参照がリターンされてきます。
そのメモリ領域には、ストリームのメモリアドレスやストリームのサイズ、モードなど、オープンに関係した情報が、カーネルによって記録されています。
このメモリ領域をFILE型オブジェクト(FILE型構造体)と言い、そのデータ型をFILE型と言います。
また、FILE型オブジェクトへの参照をファイルポインタ(またはファイルディスクリプタ)と言います。
[ファイルポインタ(シンボル)]→[FILE型オブジェクト(ストリーム情報)]→[ストリーム(ロードされたファイル)]
オープンで指定されたファイル名が存在していなかった場合、書き込みではそのファイル名で新規ファイルを生成し、読み取りでは特別なファイルポインタ(NULLポインタ)を戻します。
NULLポインタは、参照先が必ず空っぽ(無)として扱われる特別な参照です。
プログラムによるファイルの読み書き
プログラムからファイルへの読み書きは、ストリームへの読み書きになります。
この時の読み書きは、オープンモードに従った読み書きに制限されます。
- Rモードでは、ストリームの内容を変更できません。
- Wモードでは、オープンと同時に内容が空っぽに削除され、読み取りはできません。
- Aモードでは、新しい内容を末尾に追加するだけで、今までの内容は更新できません。
Rモード以外では、即座にストリーム(バッファ)の内容を変更できますが、その場合でも、ストレージに記録されているファイルの中身は即座には変更されません。
ストリームの内容変更にいったん一区切りついたところで、ストリーム(バッファ)の内容をストレージに記録されているファイルへ一気に反映させる処理を、フラッシュ(flush)と言います。
英語の stream が上流のサラサラ流れる水流のイメージなのに対して、flush はより下流の大量の水流のイメージです。
ファイルのクローズ
読み書きが終わったファイルは、クローズ処理で閉じます。
この時、Rモード以外ではストリームの内容がフラッシュされ、ストリームが初期化(メモリ領域を解放)されます。
この記事のまとめ
ファイルをロードするには、まずオープンシステムコールで、ファイル名とオープンモードを指定します。
オープンモードには、読み取り(Read)/上書き(Write)/追記(Append) 、およびバイナリ(Bynary)オプションと更新(+)オプション があります。
今、ファイルがロードされているメモリ領域を、ストリーム(stream)と言います。特に、標準入力/標準出力/標準エラー出力 を標準ストリームと言います。
入出力の進行状況に応じて、段階的に中身を入れ替えていくメモリの一時領域をバッファと言い、ストリームは通常、バッファの機能を兼ね備えています。
オープンシステムコールの戻り値には、FILE型を参照するファイルポインタが入ります。そのFILE型には、ストリームへの参照が入っています。
オープンに失敗した時は、戻り値にはファイルポインタの代わりに、NULLポインタが入ります。
ストリーム(バッファ)の内容をストレージへ一気に反映させる処理を、フラッシュ(flush)と言います。
ファイルの使用後は、クローズシステムコールでメモリを開放します。
以上で、絵でわかる プログラムとは何か(5)~データ~ は終わりです。
次は、絵でわかる プログラムとは何か(6)~シンボル~ へ進みましょう。
コンピューターのしくみ全体を理解したい場合は、以下の2コースがお勧めです。
日本全国 オンラインレッスン にも対応しています。
知りたいことだけ単発で聞きたい場合は、 オンラインサポート をご利用ください。