Oracle Solaris Studio 12.4 Man Pages

印刷ビューの終了

更新: January 2015
 
 

ios.intro(3CC4)

名前

ios.intro - iostreams とマニュアルページの概要

形式

 
#include <iostream.h>
class stream_MT ;
class streambuf : public stream_MT ;
class unsafe_ios ;
class ios : virtual public unsafe_ios, public stream_MT ;
class unsafe_istream : virtual public unsafe_ios ;
class istream : virtual public ios, public unsafe_istream ;
class unsafe_ostream : virtual public unsafe_ios ;
class ostream : virtual public ios, public unsafe_ostream ;
class unsafe_iostream : public unsafe_istream, public unsafe_ostream ;
class iostream : public istream, public ostream ;
class istream_withassign : public istream ;
class ostream_withassign : public ostream ;
class iostream_withassign : public iostream ;
class Iostream_init ;
extern istream_withassign cin ;
extern ostream_withassign cout ;
extern ostream_withassign cerr ;
extern ostream_withassign clog ;
#include <fstream.h>
class filebuf : public streambuf ;
class unsafe_fstreambase : virtual public unsafe_ios ;
class fstreambase : virtual public ios, public unsafe_fstreambase ;
class fstream : public fstreambase, public iostream ;
class ifstream : public fstreambase, public istream ;
class ofstream : public fstreambase, public ostream ;
#include <strstream.h>
class strstreambuf : public streambuf ;
class unsafe_strstreambase : public virtual unsafe_ios ;
class strstreambase : public virtual ios, public unsafe_strstreambase ;
class istrstream : public strstreambase, public istream ;
class ostrstream : public strstreambase, public ostream ;
class strstream : public strstreambase, public iostream ;
#include <stdiostream.h>
class stdiobuf : public streambuf ;
class stdiostream : public ios ;

説明

これらのマニュアルページは、C++ のストリーム I/O を構成する個々の関数およびクラスの詳細を理解するために必要な参考資料を提供します。ここで使用している「ストリーム」という用語は、C の stdio ファイル (これもストリームと呼ばれる)、または UNIX System V のストリームとは無関係です。

iostream パッケージは、libthread ライブラリのもとで複数の連携するスレッド間での iostream オブジェクトの共有をサポートするために拡張されました。現在、iostream のほとんどのクラスは、複数のスレッドによる同時アクセスに対して保護されない「非安全」バージョンと同時アクセスからオブジェクトを保護するために相互排他ロックを使用する「安全」バージョンの 2 つの形式で定義されています。クラス streambuf とクラス filebuf の 2 つは例外です。これらのオブジェクトは、関連するすべてのメンバー関数のロックされたバージョンとロックされていないバージョンの両方をサポートしています。ロックされていないバージョンは、関数名に付けられた接尾辞 _unlocked によって区別されます。

「安全な」バージョンを使用しても、マルチスレッド環境においてアプリケーションが適切に動作するとは限りません。このサブジェクトの詳細については、『C++ ライブラリリファレンス』の第 4 章「マルチスレッド環境での従来型の iostream ライブラリの使用」を参照してください。

歴史

Bjarne Stroustrup 著『プログラミング言語 C++』の原版で C++ コンパイラの初期のリリースで登場した C++ ストリーム I/O が紹介されました。通常 iostreams と呼ばれるストリーム I/O の新しいバージョンは、C++ の 2.0 リリースから登場しています。最初のストリーム I/O と比べ、iostreams は C++ 言語の機能 (特に、C++ の初期のバージョンでは使用できない新しい言語機能) を効率的に使用しています。基本的なストリーム I/O は、どちらのバージョンのストリームでも同様に機能し、iostream には、移行をさらに容易にするための下位互換性機能がいくつか組み込まれました。iostreams の最新のリリースでは、追加の言語の変更による変更が加えられています。この変更は、2 つのカテゴリに分けられます。char 型の変更とネストした型の規則の変更です。

C++ の初期の実装には 2 つの文字型しかありませんでしたが、現在 C++ には「プレーンな」charsigned char、および unsigned char の 3 つの個別の char 型のバージョンがあります。iostreams の初期のバージョンでは、符号付きの「プレーンな」 char をとる関数バージョンと、unsigned char をとるほかのバージョンがありました。これらの関数のほとんどは文字および文字の配列しか処理しないため、現在それらの関数にはほとんど「プレーンな」 char をとる 1 つのバージョンしかありません。

C++ の初期のバージョンでは、クラス内部で定義された型はクラス外部で定義されたものと同様に処理されるという C の規則を使用していました。現在、C++ 言語の規則では、クラス内部で定義された型はすべてそのクラスでローカルであり、外部のクラス修飾子でしか参照できないことになっています。これは、iostreams のほんのわずかな箇所に影響を与えています。たとえば、クラス ios の内部で定義された列挙型名は修飾する必要があります。つまり、io_state または seek_dir を使用する代わりに、ios::io_state または ios::seek_dir を使用することになりました。

これらのマニュアルページでは、iostreams を使用して、移植可能なプログラムを書くために必要なパブリック (public) インタフェースと保護された (protected) インタフェースを説明しています。公開しておらず、移植可能なプログラムで依存すべきではない実装の詳細については説明していません。

基本的なクラス

iostreams は基本的にクラス階層の集まりです。基本的なクラスは、次のとおりです。

unsafe_ios

このクラスには、エラー状態や書式設定状態など、各種ストリームクラスに共通の状態変数が含まれています。このクラスは、マルチスレッドアクセスに対して保護されません。 ios (3CC4) を参照してください。

ios

クラス ios は各ストリームの仮想基底クラスです。これは書式設定情報とステータス情報を保持します。このクラスについては ios (3CC4) で詳しく説明しています。このクラスは相互排他ロックを使用して、マルチスレッドアクセスに対して保護します。 ios (3CC4) を参照してください。

streambuf

クラス streambuf は、すべてのストリームバッファーの仮想基底クラスです。このクラスは、挿入 (格納、put とも呼ばれる) および抽出 (フェッチ、get とも呼ばれる) をサポートするバッファリングの基本機能を定義します。各非仮想メンバー関数は、2 つのバージョンで定義されています。マルチスレッドアクセスに対して保護されないロックされていないバージョン (関数名に付加された _unlocked 接尾辞によって区別される) と MT-安全なロックされたバージョン (デフォルト) です。プログラミング I/O に使用されるこのクラスのパブリック (public) インタフェースについては、sbufpub(3CC4) で説明しています。新しいバッファークラスを派生させるときに使用する、クラスの保護された (protected) インタフェースについては、sbufprot(3CC4) で説明しています。

unsafe_istream

このクラスは、streambuf からフェッチされた文字のシーケンスからの書式付きおよび書式なしの変換をサポートします。このクラスは、マルチスレッドアクセスに対して保護されません。 istream (3CC4) を参照してください。

istream

クラス istream は関連付けられている streambuf への書式付きおよび書式なしの入力操作を提供します。このクラスについては istream(3CC4) で詳しく説明しています。

unsafe_ostream

このクラスは streambuf に格納される文字のシーケンスへの書式付きおよび書式なしの変換をサポートします。このクラスは、マルチスレッドアクセスに対して保護されません。 ostream (3CC4) を参照してください。

ostream

クラス ostream は関連付けられている streambuf への書式付きおよび書式なしの出力操作を提供します。このクラスについては ostream(3CC4) で詳しく説明しています。

iostream

クラス iostream は、istreamostream の機能を組み合わせたものです。iostream は、単一の双方向ストリーム上で入力と出力の両方を提供します。

istream_withassign
ostream_withassign
iostream_withassign

クラス istream_withassignostream_withassign、および iostream_withassign は、それぞれの対応するクラスである istreamostream、および iostream に代入演算子を追加したものです。定義済みのストリーム cincoutcerr、および clog (後述) は、技術的な理由で代入演算子が必要で、これらのクラス型のオブジェクトです。

派生バッファークラス

ストリームに関連付けられたバッファークラスは、文字のフェッチまたは格納の方法を定義します。sbufprot3CC4() で説明しているように、streambuf から独自のバッファークラスを派生させることができます。iostreams には 3 つの定義済みのバッファークラスが提供されています。

filebuf

このバッファークラスは、低レベルのファイル記述子によるファイルの I/O を提供します。filebuf では C の標準 I/O (stdio) は使用しません。メンバー関数は、ファイルのオープン、クローズ、シーク操作をサポートします。filebuf との get または put を行う場合、バッファークラスは必要に応じて関連付けられたファイルを読み取りまたは書き込みします。各非仮想メンバー関数は、2 つのバージョンで定義されています。マルチスレッドアクセスに対して保護されないロックされていないバージョン (関数名に付加された _unlocked 接尾辞によって区別される) と MT-安全なロックされたバージョン (デフォルト) です。このクラスについては filebuf(3CC4) で詳しく説明しています。

stdiobuf

このバッファークラスは、C の標準入出力 FILE 構造体を使用して I/O を提供します。I/O のこの形式は、filesbuf を使用した場合よりはるかに非効率的です。iostream と C の標準入出力を使用して、同じファイルへの I/O を混在させる必要がある場合は、ストリームバッファークラスとして stdiobuf を使用します。それ以外の場合は、filebuf を使用します。このクラスについては stdiobuf(3CC4) で詳しく説明しています。

strstreambuf

このクラスは、ストリームと文字配列との間で書式付きおよび書式なしのメモリー転送を行います。各非仮想メンバー関数は、2 つのバージョンで定義されています。マルチスレッドアクセスに対して保護されないロックされていないバージョン (関数名に付加された _unlocked 接尾辞によって区別される) と MT-安全なロックされたバージョン (デフォルト) です。このクラスについては ssbuf(3CC4) で詳しく説明しています。

派生ストリームクラス

通常、ストリームクラスは、istreamostream、または iostream のいずれかから派生させたり、専門のバッファークラスを使用して定義します。もっとも一般的なニーズのため、いくつかの定義済みストリームクラスがあります。

ifstream
ofstream
fstream

これらのクラスは、関連付けられたバッファークラスとして filebuf を使用してファイル I/O をサポートします。それらはそれぞれ、入力、出力、双方向に使用します。これらのクラスは、相互排他ロックによってマルチスレッドアクセスに対して保護されます。これらのクラスについては fstream(3CC4) で詳しく説明しています。

istrstream
ostrstream
strstream

これらのクラスは、関連付けられたバッファークラスとして strstreambuf を使用して、メモリー内の文字配列による I/O をサポートします。それらはそれぞれ、入力、出力、双方向に使用します。これらのクラスは、相互排他ロックによってマルチスレッドアクセスに対して保護されます。これらのクラスについては strstream (3CC4) で詳しく説明しています。

stdiostream

このクラスは、関連付けられたバッファークラスとして stdiobuf を使用します。前述のように、これは fstream を使用したり、filebuf を使用したほかのストリームを使用したりするよりも、はるかに非効率的です。stdiostream を使用する唯一の理由は、iostreams コードと C の標準入出力コードの両方から同じファイルへの I/O を実行できることです。このクラスについては stdiobuf(3CC4) で詳しく説明しています。

定義済みストリーム

C および C++ プログラムは従来 I/O 用に 3 つの定義済みファイル (標準入力、出力、およびエラーファイル) で実行を開始します。プログラムに <iostream.h> を取り込むと、4 つの定義済み iostreams が利用可能になります。

cin

標準入力 (ファイル記述子 0) に接続されます。

cout

標準出力 (ファイル記述子 1) に接続されます。

cerr

標準エラー (ファイル記述子 2) に接続されます。cerr に書き込まれるデータはデフォルトで単位バッファリングされます。つまり、完全な挿入操作後に文字がフラッシュされます。

clog

標準エラー (ファイル記述子 2) に接続されます。このストリームはデフォルトで完全にバッファリングされ、これが cerr を使用する場合との唯一の違いです。

ストリーム cincerr、および clogcout結合されます。つまり cin から抽出する前、または cerr または clog に挿入する前に cout がフラッシュされます。定義済みストリームは、デフォルトで相互排他ロックを使用して、マルチスレッドアクセスに対して保護されます。この保護を無効にするには、クラス stream_MT で定義されているメンバー関数 set_safe_flag を呼び出します。

「ヘッダー・ファイル」

<iostream.h>

このヘッダーは、定義済みストリームの使用など、iostreams の基本機能を提供します。

<fstream.h>

このヘッダーは <iostream.h> を取り込み、filebuf クラスと fstream クラスも定義します。

<strstream.h>

このヘッダーは <iostream.h> を取り込み、strstreambuf クラスと strstream クラスも定義します。

<stdiostream.h>

このヘッダーは <iostream.h> を取り込み、stdiobuf クラスと stdiostream クラスも定義します。

<manip.h>

このヘッダーはいくつかの標準のマニピュレータを定義します。マニピュレータについては、チュートリアルと manip(3CC4) で説明しています。

関連項目

filebuf(3CC4), fstream(3CC4), ios(3CC4), istream(3CC4), manip(3CC4), ostream(3CC4), sbufprot(3CC4), sbufpub(3CC4), ssbuf(3CC4) stdiobuf(3CC4), strstream(3CC4), stream_locker(3CC4), stream_MT(3CC4)

C++ ライブラリリファレンス』の第 3 章「従来型の iostream ライブラリ」および第 4 章「マルチスレッド環境での従来型の iostreams ライブラリの使用」