#include <fstream.h> typedef long streampos; typedef long streamoff; class ios : virtual public unsafe_ios, public stream_MT { public: enum open_mode { in = 0x01, // 読み取りのためにオープン out = 0x02, // 書き込みのためにオープン ate = 0x04, // 最初のオープン時に EOF までシーク app = 0x08, // 追加モード: EOF にすべて追加 trunc = 0x10, // ファイルがすでに存在する場合ファイルを切り捨て nocreate = 0x20, // ファイルが存在しない場合オープンが失敗 noreplace= 0x40 // ファイルがすでに存在する場合オープンが失敗 };
enum seek_dir { beg=0, cur=1, end=2 };
// 残りについては ios(3CC4) を参照... };
class filebuf : public streambuf { public: static const int openprot ; /* オープンのデフォルトの保護 */
filebuf() ; ~filebuf() ; filebuf(int f); filebuf(int f, char* p, int len) ;
filebuf* attach(int f) ; filebuf* attach_unlocked(int); filebuf* close(); filebuf* close_unlocked(); int detach() ; int detach_unlocked(); int fd(); int is_open(); int is_open_unlocked(); filebuf* open(char *name, int omode, int prot=openprot) ; filebuf* open_unlocked(const char*, int, int=filebuf::openprot); streampos seekoff(streamoff, seek_dir, int omode) ; streampos seekpos(streampos, int omode) ; streambuf* setbuf(char* p, int len) ; int sync() ; };
filebuf クラスは、文字の入力元または出力先としてファイルを使用するように streambuf を特殊化したものです。文字はファイルからフェッチ (入力) され、ファイルによって消費され (ファイルに書き込まれ) ます。filebuf がオープンファイルに接続 (アタッチ) されている場合、filebuf はオープンしていると呼ばれ、そうでない場合、クローズしています。ファイルはデフォルトで保護モード filebuf::openprot (0666) でオープンされます。
アタッチされているファイルがシーク可能な場合、filebuf ではシークが可能です。たとえば、通常のディスクファイルはシーク可能ですが、端末はシークできません。アタッチされたファイルで読み取り (書き込み) が可能な場合は、filebuf でフェッチ (格納) が可能です。たとえば、標準入力では読み取りのみが可能で、標準出力では書き込みのみが可能です。C の stdio と異なり、同じ filebuf への get と put の間でシークは不要です。最初に 4 文字以上の書き戻しが可能です。
streambuf の基本操作については、sbufprot(3CC4) および sbufpub(3CC4) で説明しています。予約領域は、コンストラクタに提供されていない場合に自動的に、または、setbuf の呼び出しによって割り当てられます (通常、setbuf の呼び出しが推奨されます)。filebuf をバッファリングしないようにすると、各入力および出力文字にシステムコールが必要です。get ポインタと put ポインタは 1 つのポインタのように動作します。概念的にそれらは結合されています。
filebuf は、UNIX のファイル記述子 (システムコールで渡される小さな整数) を介してファイルを操作します。C の標準入出力は使用されません。注: 提供されているファイル記述子は、妥当性がチェックされません。
いくつかのメンバー関数は 2 つのバージョンで定義されています。マルチスレッドアクセスに対して保護されない「非安全」バージョン (接尾辞 _unlocked が付く) と、複数のスレッドによる同時アクセスに対して保護するために相互排他ロックを使用する「安全」バージョン (デフォルト) です。
クローズした filebuf を作成します。
オープンしていると想定されるファイル記述子 f にアタッチされた、オープンしている filebuf を作成します。
オープンしていると想定されるファイル記述子 f にアタッチされた、オープンしている filebuf を作成します。初期予約領域として p から始まる len char の配列を使用します。p がゼロ、または len がゼロ以下のとき、filebuf はバッファリングされません。
fbuf がクローズしている場合、それをファイル記述子 f (オープンしていると想定) に接続し、fbuf のアドレスを返します。fbuf がすでにオープンしている場合は f を無視してゼロを返します。このメンバーは MT-安全です。
機能的には attach と同じですが、相互排他ロックを実行しないため、MT-安全ではありません。
ファイル記述子に関連付けられているファイルへの待機中の出力をフラッシュし、f からファイル記述子を切り離します。ファイル記述子が返されます。アタッチされているファイル記述子を close() によってクローズさせたくないアプリケーションは、close() の前にこの関数を呼び出してください。このメンバーは MT-安全です。
機能的には detach と同じですが、相互排他ロックを実行しないため、MT-安全ではありません。
保留中の出力をフラッシュし、ファイル記述子を無条件にクローズし、fbuf をクローズします。エラー時はゼロ、それ以外の場合は fbuf のアドレスを返します。このメンバーは MT-安全です。
機能的には close と同じですが、相互排他ロックを実行しないため、MT-安全ではありません。
fbuf にアタッチされているファイル記述子を返すか、または fbuf がオープンしていない場合は EOF を返します。
fbuf がオープンしている (ファイル記述子に接続されている) 場合はゼロ以外、それ以外の場合はゼロを返します。このメンバーは MT-安全です。
機能的には is_open と同じですが、相互排他ロックを実行しないため、MT-安全ではありません。
fbuf がまだオープンしていない場合、この関数はファイル name をオープンし、そのファイル記述子を fbuf に接続します。それ以外の場合はエラーになります。ファイルが存在せず、mode に ios::nocreate が設定されていない場合、open は prot に指定された保護ビット (デフォルト値は 0666) でファイルを作成しようとします。mode パラメータは、ともに論理和をとることができる、fstream3CC4() で説明されている ios::open_mode のビットの集まりです。この関数は、成功時に fbuf のアドレス、何らかの失敗時にゼロを返します。このメンバーは MT-安全です。
機能的には open と同じですが、相互排他ロックを実行しないため、MT-安全ではありません。
sbufpub(3CC4) で説明しているように、off と dir により、get/put ポインタの組み合わせを移動します。ただし、mode パラメータは無視されます。fbuf がオープンしていない、アタッチされたファイルがシークをサポートしていない、またはシークをサポートしていても実行できない (ファイルの off または終端など) の場合、操作は失敗します。off はファイル内の dir によって指定された位置への相対オフセットです。成功時にファイルの新しい位置、失敗時に EOF を返します。エラーの場合のファイルの位置は未定義です。
呼び出し fbuf.seekoff((streamoff)pos, ios::beg, mode) と等価です。pos の値は、seekoff または seekpos の以前の呼び出しから取得したもの、またはファイルの先頭を表すゼロの値にしてください。sbufpub(3CC4) も参照してください。
fbuf がオープンしていて、予約領域が割り当てられている場合、何も変更が行われず、setbuf はゼロを返します。それ以外の場合、新しい予約領域は p が指す位置から始まる len char になり、関数は fbuf のアドレスを返します。p がゼロ、または len がゼロ以下の場合、予約領域はなく、fbuf はバッファリングされません。
get/put ポインタをアタッチされたファイルの実際の位置と一致 (同期) させるように試みます。これには、書き込まれていない文字のフラッシュやすでに入力された文字へのファイルのバックアップが含まれることがあります。正常時にゼロ、エラー時に EOF を返します。文字のグループが同時にファイルに書き込まれるようにする必要がある場合、それらの最大のグループよりも大きい予約領域を割り当て、文字を格納する直前に sync を実行して、さらに直後に再度実行します。
fstream(3CC4), ios(3CC4), ios.intro(3CC4), sbufprot(3CC4), sbufpub(3CC4), stream_locker(3CC4), stream_MT(3CC4)
『C++ ライブラリリファレンス』の第 3 章「従来型の iostream ライブラリ」および第 4 章「マルチスレッド環境での従来型の iostreams ライブラリの使用」
UNIX は通常、シークの失敗を報告せず、filebuf も報告しません。