time_put ファセットで日付を出力する応用例を示します。出力する日付を次のように定めます。
struct tm aDate; //1 memset(aDate,0,sizeof aDate); //2 aDate.tm_year = 1989; aDate.tm_mon = 9; aDate.tm_mday = 1; cout.imbue(locale::locale("De_CH")); //3 cout << aDate; //4
//1 | 日付オブジェクトを作成します。型は tm です。これは標準 C ライブラリで定義した時間構造体です。 |
//2 | 日付オブジェクトが 1989 年 9 月 1 日に初期化されます。 |
//3 | このプログラムの使用地域は、スイスのドイツ語圏の州ということにします。したがって、標準出力ストリームはドイツ-スイスロケールに組み込みます。 |
//4 | 日付がドイツ式で出力ストリームに出力されます。 |
出力結果: 1. September 1989
C ライブラリの時間構造体 tm のための演算子 <<() は、標準 C++ ライブラリには定義されていないため、挿入子を設定する必要があります。次のコードでこの方法を示します。入出力ストリームの詳細については、『標準 C++ ライブラリ・ユーザーズガイド』の入出力ストリームの節を参照してください。
複雑になることを防ぐため、書式設定時に生じる例外の送出処理は省略します。
template<class charT, class traits> basic_ostream<charT, traits>& operator<<(basic_ostream<charT,traits>& os, const tm& date) //1 { locale loc = os.getloc(); //2 typedef ostreambuf_iterator<charT,traits> outIter_t; //3 const time_put<charT,outIter_t>& fac //4 = use_facet < time_put<charT, bufIter_t > > (loc); //5 fac.put(os,os,os.fill(),&date,'x'); //6 return os; }
//1 | ストリーム挿入子の典型的な識別形式です。出力ストリームまでの参照と印刷するオブジェクトまでの固定参照を取り出し、同じストリームまでの参照を返します。 | ||||||||||||
//2 | ストリームのロケールオブジェクトは、ストリームのメンバー関数 getloc() で得られます。このロケールオブジェクトに、求める時間書式ファセットオブジェクトがあるはずです。 | ||||||||||||
//3 | ストリームバッファまでの出力反復子の型を定義します。 時間書式設定ファセットオブジェクトでは、書式設定した出力を反復子により出力コンテナに書き込みます (『標準 C++ ライブラリ・ユーザーズガイド』のコンテナと反復子の節を参照してください)。基本的に、これは文字列や C++ 配列などの出力反復子がある任意コンテナです。 ここでは、時間書式設定ファセットオブジェクトは、ストリームの書式設定層を経由せずに、出力ストリームの基本ストリームバッファに直接的に書き込むようにします。したがって、出力コンテナはストリームバッファになります。 |
||||||||||||
//4 | ロケールオブジェクトの time_put ファセットオブジェクトまでの参照を保持する変数を定義します。時間書式設定ファセットクラス time_put には 2 つのテンプレートパラメータがあります。 最初のテンプレートパラメータは、出力に使用する文字型です。ストリームの文字型をテンプレート引数として指定します。 2 番目のテンプレートパラメータは、出力反復子型です。ここでは、以前に定義したストリームバッファ反復子型 outIter_t を指定します。 |
||||||||||||
//5 | ストリームのロケールから、use_facet() によって時間書式設定ファセットオブジェクトを取り出します。 | ||||||||||||
//6 | ファセットオブジェクトの書式設定サービス put() が呼び出されます。どのような引数を使用するのかを確認してください。次に示すのは、関数のインタフェースです。
iter_type put (iter_type (a) ,ios_base& (b) ,char_type (c) ,const tm* (d) ,char) (e)
|
Copyright (c) 1998, Rogue Wave Software, Inc.
このマニュアルに関する誤りのご指摘やご質問は、電子メールにてお送りください。
OEM リリース, 1998 年 6 月