char_traits 構造体

char_traits 構造体は文字に関連付けられた属性を記述します。

構文

template <class CharType>
struct char_traits;

パラメーター

CharType
要素のデータ型。

解説

テンプレートの構造体は CharType 型のさまざまな文字特性を記述します。 このクラス テンプレート basic_string は、basic_ios などのいくつかの iostream クラス テンプレートと同様、この情報を使用して CharType 型の要素を操作します。 このような要素型では、明示的な構築や破棄を要求できません。 既定のコンストラクター、コピー コンストラクター、および代入演算子を、必要なセマンティクスと共に指定する必要があります。 ビットごとのコピーは、代入と同じ効果を持つ必要があります。 char_traits 構造体のメンバー関数は、いずれも例外をスローしません。

Typedefs

型名 説明
char_type 文字の型。
int_type char_type 型の文字、またはファイルの終端 (EOF) 文字を表すことができる整数型。
off_type ストリーム内の位置間のオフセットを表すことのできる整数型。
pos_type ストリーム内の位置を表すことのできる整数型。
state_type ストリーム内のマルチバイト文字の変換状態を表す型。

メンバー関数

メンバー関数 説明
assign 1 つの文字の値を別の文字に割り当てます。
compare 指定した文字数まで 2 つの文字列を比較します。
copy 1 つの文字列から別の文字列に指定した数の文字をコピーします。 削除されました。 代わりに char_traits::_Copy_s を使用してください。
_Copy_s 1 つの文字列から別の文字列に指定した数の文字をコピーします。
eof ファイルの終端 (EOF) 文字を返します。
eq 2 つの char_type 文字が等しいかどうかをテストします。
eq_int_type int_type として表される 2 つの文字が等しいかどうかをテストします。
find 文字の範囲内で指定した文字が最初に出現する位置を検索します。
length 文字列の長さを返します。
lt 1 つの文字が別の文字よりも小さいかどうかをテストします。
move シーケンス内の文字を、指定された文字数だけ、重複が生じる可能性のある別のシーケンスにコピーします。 削除されました。 代わりに char_traits::_Move_s を使用してください。
_Move_s シーケンス内の文字を、指定された文字数だけ、重複が生じる可能性のある別のシーケンスにコピーします。
not_eof 文字がファイルの終端 (EOF) 文字であるかどうかをテストします。
to_char_type int_type の文字を char_type の対応する文字に変換し、その結果を返します。
to_int_type char_type の文字を int_type の対応する文字に変換し、その結果を返します。

必要条件

ヘッダー:<string>

名前空間: std

char_traits::assign

別の文字値または文字列内の要素の範囲に 1 つの文字値を割り当てます。

static void assign(char_type& _CharTo,
    const char_type& _CharFrom);

static char_type *assign(char_type* strTo,
    size_t _Num,
    char_type _CharFrom);

パラメーター

_CharFrom 値が割り当てられる文字。

_CharTo
文字値を割り当てられる要素。

strTo
最初の要素が割り当てられた文字値になる文字列または文字の配列。

_Num
値を割り当てられる要素の数。

戻り値

2 番目のメンバー関数は、最初の _Num 要素に _CharFrom という値が割り当てられている文字列へのポインターを返します。

// char_traits_assign.cpp
// compile with: /EHsc
#include <string>
#include <iostream>

int main( )
{
   using namespace std;

   // The first member function assigning
   // one character value to another character
   char ChTo = 't';
   const char ChFrom = 'f';
   cout << "The initial characters ( ChTo , ChFrom ) are: ( "
        << ChTo << " , " << ChFrom << " )." << endl;
   char_traits<char>::assign ( ChTo , ChFrom );
   cout << "After assigning, the characters ( ChTo , ChFrom ) are: ( "
        << ChTo << " , " << ChFrom << " )." << endl << endl;

   // The second member function assigning
   // character values to initial part of a string
   char_traits<char>::char_type s1[] = "abcd-1234-abcd";
   char_traits<char>::char_type* result1;
   cout << "The target string s1 is: " << s1 << endl;
   result1 = char_traits<char>::assign ( s1 , 4 , 'f' );
   cout << "The result1 = assign ( s1 , 4 , 'f' ) is: "
        << result1 << endl;
}
The initial characters ( ChTo , ChFrom ) are: ( t , f ).
After assigning, the characters ( ChTo , ChFrom ) are: ( f , f ).

The target string s1 is: abcd-1234-abcd
The result1 = assign ( s1 , 4 , 'f' ) is: ffff-1234-abcd

char_traits::char_type

文字の型。

typedef CharType char_type;

解説

この型は、テンプレート パラメーター CharTypeのシノニムです。

char_type の宣言方法や使用方法の例については、copy の例を参照してください。

char_traits::compare

指定した文字数まで 2 つの文字列を比較します。

static int compare(const char_type* str1,
    const char_type* str2,
    size_t _Num);

パラメーター

str1
相互に比較する 2 つの文字列の最初の文字列。

str2
相互に比較する 2 つの文字列の 2 番目の文字列。

_Num
比較する文字列内の要素の数。

戻り値

最初の文字列が 2 番目の文字列より少ない場合は負の値、2 つの文字列が等しい場合は 0、最初の文字列が 2 番目の文字列より多い場合は正の値になります。

解説

文字列間の比較は要素ごとに行われます。最初に等しいかどうかがテストされ、シーケンス テスト内の要素のペアが等しくない場合は、より少ないかどうかのテストが実行されます。

2 つの文字列の比較で一定の範囲が等しい場合でも、1 つの文字列が他の文字列より長い場合、2 つのうち短い文字列が長い文字列よりも少ないということになります。

// char_traits_compare.cpp
// compile with: /EHsc
#include <string>
#include <iostream>

int main() {
   using namespace std;

   char_traits<char>::char_type* s1 = "CAB";
   char_traits<char>::char_type* s2 = "ABC";
   char_traits<char>::char_type* s3 = "ABC";
   char_traits<char>::char_type* s4 = "ABCD";

   cout << "The string s1 is: " << s1 << endl;
   cout << "The string s2 is: " << s2 << endl;
   cout << "The string s3 is: " << s3 << endl;
   cout << "The string s4 is: " << s4 << endl;

   int comp1, comp2, comp3, comp4;
   comp1 = char_traits<char>::compare ( s1 , s2 , 2 );
   comp2 = char_traits<char>::compare ( s2 , s3 , 3 );
   comp3 = char_traits<char>::compare ( s3 , s4 , 4 );
   comp4 = char_traits<char>::compare ( s4 , s3 , 4 );
   cout << "compare ( s1 , s2 , 2 ) = " << comp1 << endl;
   cout << "compare ( s2 , s3 , 3 ) = " << comp2 << endl;
   cout << "compare ( s3 , s4 , 4 ) = " << comp3 << endl;
   cout << "compare ( s4 , s3 , 4 ) = " << comp4 << endl;
}

char_traits::copy

1 つの文字列から別の文字列に指定した数の文字をコピーします。

渡された値が正しいことの確認を呼び出し元に依存するため、このメソッドは安全ではない可能性があります。 代わりに char_traits::_Copy_s の使用を検討してください。

static char_type *copy(char_type* _To,
    const char_type* _From,
    size_t _Num);

パラメーター

_To
コピーされた文字のシーケンスの受信ターゲットとなる文字列または文字配列の先頭にある要素。

_From
コピーされるソース文字列または文字配列の先頭にある要素。

_Num
コピーする要素の数。

戻り値

コピーされた文字のシーケンスの受信ターゲットとなる文字列または文字配列にコピーされる最初の要素 。

解説

ソースとコピー先の文字シーケンスは重複できません。

// char_traits_copy.cpp
// compile with: /EHsc /W3
#include <string>
#include <iostream>

int main( )
{
   using namespace std;

   char_traits<char>::char_type s1[] = "abcd-1234-abcd";
   char_traits<char>::char_type s2[] = "ABCD-1234";
   char_traits<char>::char_type* result1;
   cout << "The source string is: " << s1 << endl;
   cout << "The destination string is: " << s2 << endl;
   // Note: char_traits::copy is potentially unsafe, consider
   // using char_traits::_Copy_s instead.
   result1 = char_traits<char>::copy ( s1 , s2 , 4 );  // C4996
   cout << "The result1 = copy ( s1 , s2 , 4 ) is: "
        << result1 << endl;
}
The source string is: abcd-1234-abcd
The destination string is: ABCD-1234
The result1 = copy ( s1 , s2 , 4 ) is: ABCD-1234-abcd

char_traits::_Copy_s

1 つの文字列から別の文字列に指定した数の文字をコピーします。

static char_type *_Copy_s(
    char_type* dest,
    size_t dest_size,
    const char_type* _From,
    size_t count);

パラメーター

dest
コピーされた文字のシーケンスの受信ターゲットとなる文字列または文字配列。

dest_size
dest のサイズ。 char_typechar の場合、サイズはバイト単位です。 char_typewchar_t の場合、サイズはワード数単位です。

_From
コピーされるソース文字列または文字配列。

count
コピーする要素の数。

戻り値

コピーされた文字のシーケンスの受信ターゲットとなる文字列または文字配列。

解説

ソースとコピー先の文字シーケンスは重複できません。

// char_traits__Copy_s.cpp
// compile with: /EHsc
#include <string>
#include <iostream>

int main( )
{
    using namespace std;

    char_traits<char>::char_type s1[] = "abcd-1234-abcd";
    char_traits<char>::char_type s2[] = "ABCD-1234";
    char_traits<char>::char_type* result1;
    cout << "The source string is: " << s1 << endl;
    cout << "The destination string is: " << s2 << endl;
    result1 = char_traits<char>::_Copy_s(s1,
        char_traits<char>::length(s1), s2, 4);
    cout << "The result1 = _Copy_s(s1, "
         << "char_traits<char>::length(s1), s2, 4) is: "
         << result1 << endl;
}
The source string is: abcd-1234-abcd
The destination string is: ABCD-1234
The result1 = _Copy_s(s1, char_traits<char>::length(s1), s2, 4) is: ABCD-1234-abcd

char_traits::eof

ファイルの終端 (EOF) 文字を返します。

static int_type eof();

戻り値

EOF 文字。

解説

ファイルの終わりを表す値 (たとえば EOF または WEOF)。

C++ 規格によると、この値は、有効な char_type 値に対応しないようにする必要があります。 Microsoft C++ コンパイラは型 wchar_t ではなく、型 char にこの制約を適用します。 次に示しているのはその例です。

// char_traits_eof.cpp
// compile with: /EHsc
#include <string>
#include <iostream>

int main()
{
    using namespace std;

    char_traits<char>::char_type ch1 = 'x';
    char_traits<char>::int_type int1;
    int1 = char_traits<char>::to_int_type(ch1);
    cout << "char_type ch1 is '" << ch1 << "' and corresponds to int_type "
         << int1 << "." << endl << endl;

    char_traits<char>::int_type int2 = char_traits<char>::eof();
    cout << "The eof marker for char_traits<char> is: " << int2 << endl;

    char_traits<wchar_t>::int_type int3 = char_traits<wchar_t>::eof();
    cout << "The eof marker for char_traits<wchar_t> is: " << int3 << endl;
}
char_type ch1 is 'x' and corresponds to int_type 120.

The eof marker for char_traits<char> is: -1
The eof marker for char_traits<wchar_t> is: 65535

char_traits::eq

2 つの char_type 文字が等しいかどうかをテストします。

static bool eq(const char_type& _Ch1, const char_type& _Ch2);

パラメーター

_Ch1
等しいかどうかをテストする 2 つの文字の最初の文字。

_Ch2
等しいかどうかをテストする 2 つの文字の 2 番目文字。

戻り値

最初の文字が 2 番目の文字に等しい場合は true、等しくない場合は false です。

// char_traits_eq.cpp
// compile with: /EHsc
#include <string>
#include <iostream>

int main( )
{
   using namespace std;

   char_traits<char>::char_type ch1 =  'x';
   char_traits<char>::char_type ch2 =  'y';
   char_traits<char>::char_type ch3 =  'x';

   // Testing for equality
   bool b1 = char_traits<char>::eq ( ch1 , ch2 );
   if ( b1 )
      cout << "The character ch1 is equal "
           << "to the character ch2." << endl;
   else
      cout << "The character ch1 is not equal "
           << "to the character ch2." << endl;

   // An equivalent and alternatively test procedure
   if ( ch1 == ch3 )
      cout << "The character ch1 is equal "
           << "to the character ch3." << endl;
   else
      cout << "The character ch1 is not equal "
           << "to the character ch3." << endl;
}
The character ch1 is not equal to the character ch2.
The character ch1 is equal to the character ch3.

char_traits::eq_int_type

int_type として表される 2 つの文字が等しいかどうかをテストします。

static bool eq_int_type(const int_type& _Ch1, const int_type& _Ch2);

パラメーター

_Ch1
int_type として等しいかどうかをテストする 2 つの文字の最初の文字。

_Ch2
int_type として等しいかどうかをテストする 2 つの文字の 2 番目の文字。

戻り値

最初の文字が 2 番目の文字に等しい場合は true、等しくない場合は false です。

// char_traits_eq_int_type.cpp
// compile with: /EHsc
#include <string>
#include <iostream>

int main( )
{
   using namespace std;

   char_traits<char>::char_type ch1 =  'x';
   char_traits<char>::char_type ch2 =  'y';
   char_traits<char>::char_type ch3 =  'x';

   // Converting from char_type to int_type
   char_traits<char>::int_type int1, int2 , int3;
   int1 =char_traits<char>:: to_int_type ( ch1 );
   int2 =char_traits<char>:: to_int_type ( ch2 );
   int3 =char_traits<char>:: to_int_type ( ch3 );

   cout << "The char_types and corresponding int_types are:"
        << "\n    ch1 = " << ch1 << " corresponding to int1 = "
        << int1 << "."
        << "\n    ch2 = " << ch2 << " corresponding to int1 = "
        << int2 << "."
        << "\n    ch3 = " << ch3 << " corresponding to int1 = "
        << int3 << "." << endl << endl;

   // Testing for equality of int_type representations
   bool b1 = char_traits<char>::eq_int_type ( int1 , int2 );
   if ( b1 )
      cout << "The int_type representation of character ch1\n "
           << "is equal to the int_type representation of ch2."
           << endl;
   else
      cout << "The int_type representation of character ch1\n is "
           << "not equal to the int_type representation of ch2."
           << endl;

   // An equivalent and alternatively test procedure
   if ( int1 == int3 )
      cout << "The int_type representation of character ch1\n "
           << "is equal to the int_type representation of ch3."
           << endl;
   else
      cout << "The int_type representation of character ch1\n is "
           << "not equal to the int_type representation of ch3."
           << endl;
}
The char_types and corresponding int_types are:
    ch1 = x corresponding to int1 = 120.
    ch2 = y corresponding to int1 = 121.
    ch3 = x corresponding to int1 = 120.

The int_type representation of character ch1
is not equal to the int_type representation of ch2.
The int_type representation of character ch1
is equal to the int_type representation of ch3.

char_traits::find

文字の範囲内で指定した文字が最初に出現する位置を検索します。

static const char_type* find(const char_type* str,
    size_t _Num,
    const char_type& _Ch);

パラメーター

str
検索される文字列の先頭の文字。

_Num
検索される範囲内で先頭から数えてその位置が何番目かを示す数。

_Ch
範囲内で検索される文字。

戻り値

一致するものが見つかった場合は、範囲内で指定された値の最初に出現した箇所へのポインター、それ以外の場合は、Null ポインター。

// char_traits_find.cpp
// compile with: /EHsc
#include <string>
#include <iostream>

int main( )
{
   using namespace std;

   const char* s1 = "f2d-1234-abcd";
   const char* result1;
   cout << "The string to be searched is: " << s1 << endl;

   // Searching for a 'd' in the first 6 positions of string s1
   result1 = char_traits<char>::find ( s1 , 6 , 'd');
   cout << "The character searched for in s1 is: "
        << *result1 << endl;
   cout << "The string beginning with the first occurrence\n "
        << "of the character 'd' is: " << result1 << endl;

   // When no match is found the NULL value is returned
   const char* result2;
   result2 = char_traits<char>::find ( s1 , 3 , 'a');
   if ( result2 == NULL )
      cout << "The result2 of the search is NULL." << endl;
   else
      cout << "The result2 of the search  is: " << result1
           << endl;
}
The string to be searched is: f2d-1234-abcd
The character searched for in s1 is: d
The string beginning with the first occurrence
of the character 'd' is: d-1234-abcd
The result2 of the search is NULL.

char_traits::int_type

char_type 型の文字、またはファイルの終端 (EOF) 文字を表すことができる整数型。

typedef long int_type;

解説

元の値を変更せずに型 CharType の値を int_type に型キャストしてから、CharType に戻すことができる必要があります。

int_type の宣言方法や使用方法の例については、eq_int_type の例を参照してください。

char_traits::length

文字列の長さを返します。

static size_t length(const char_type* str);

パラメーター

str
長さを測定する C 文字列。

戻り値

Null 終端文字を含まない、測定するシーケンス内の要素の数。

// char_traits_length.cpp
// compile with: /EHsc
#include <string>
#include <iostream>

int main( )
{
   using namespace std;
   const char* str1= "Hello";
   cout << "The C-string str1 is: " << str1 << endl;

   size_t lenStr1;
   lenStr1 = char_traits<char>::length ( str1 );
   cout << "The length of C-string str1 is: "
        << lenStr1 << "." << endl;
}
The C-string str1 is: Hello
The length of C-string str1 is: 5.

char_traits::lt

1 つの文字が別の文字よりも小さいかどうかをテストします。

static bool lt(const char_type& _Ch1, const char_type& _Ch2);

パラメーター

_Ch1
少ないかどうかをテストする 2 つの文字の最初の文字。

_Ch2
少ないかどうかをテストする 2 つの文字の 2 番目の文字。

戻り値

最初の文字が 2 番目の文字より少ない場合は true、それ以外の場合は false です。

// char_traits_lt.cpp
// compile with: /EHsc
#include <string>
#include <iostream>

int main( )
{
   using namespace std;
   char_traits<char>::char_type ch1 =  'x';
   char_traits<char>::char_type ch2 =  'y';
   char_traits<char>::char_type ch3 =  'z';

   // Testing for less than
   bool b1 = char_traits<char>::lt ( ch1 , ch2 );
   if ( b1 )
      cout << "The character ch1 is less than "
           << "the character ch2." << endl;
   else
      cout << "The character ch1 is not less "
           << "than the character ch2." << endl;

   // An equivalent and alternatively test procedure
   if ( ch3 <  ch2 )
      cout << "The character ch3 is less than "
           << "the character ch2." << endl;
   else
      cout << "The character ch3 is not less "
           << "than the character ch2." << endl;
}
The character ch1 is less than the character ch2.
The character ch3 is not less than the character ch2.

char_traits::move

シーケンス内の文字を、指定された文字数だけ、重複が生じる可能性のある別のシーケンスにコピーします。

渡された値が正しいことの確認を呼び出し元に依存するため、このメソッドは安全ではない可能性があります。 代わりに char_traits::_Move_s の使用を検討してください。

static char_type *move(char_type* _To,
    const char_type* _From,
    size_t _Num);

パラメーター

_To
コピーされた文字のシーケンスの受信ターゲットとなる文字列または文字配列の先頭にある要素。

_From
コピーされるソース文字列または文字配列の先頭にある要素。

_Num
ソース文字列からコピーされる要素の数。

戻り値

コピーされた文字のシーケンスの受信ターゲットとなる文字列または文字配列にコピーされる最初の要素 _To

解説

ソースと宛先が重複してもかまいません。

// char_traits_move.cpp
// compile with: /EHsc /W3
#include <string>
#include <iostream>

int main( )
{
   using namespace std;

   char_traits<char>::char_type sFrom1[] =  "abcd-1234-abcd";
   char_traits<char>::char_type sTo1[] =  "ABCD-1234";
   char_traits<char>::char_type* result1;
   cout << "The source string sFrom1 is: " << sFrom1 << endl;
   cout << "The destination stringsTo1 is: " << sTo1 << endl;
   // Note: char_traits::move is potentially unsafe, consider
   // using char_traits::_Move_s instead.
   result1 = char_traits<char>::move ( sTo1 ,  sFrom1 , 4 );  // C4996
   cout << "The result1 = move ( sTo1 , sFrom1 , 4 ) is: "
        << result1 << endl << endl;

   // When source and destination overlap
   char_traits<char>::char_type sToFrom2[] = "abcd-1234-ABCD";
   char_traits<char>::char_type* result2;
   cout << "The source/destination string sToFrom2 is: "
        << sToFrom2 << endl;
   const char* findc = char_traits<char>::find ( sToFrom2 , 4 , 'c' );
   // Note: char_traits::move is potentially unsafe, consider
   // using char_traits::_Move_s instead.
   result2 = char_traits<char>::move ( sToFrom2 , findc , 8 );  // C4996
   cout << "The result2 = move ( sToFrom2 , findc , 8 ) is: "
        << result2 << endl;
}
The source string sFrom1 is: abcd-1234-abcd
The destination stringsTo1 is: ABCD-1234
The result1 = move ( sTo1 , sFrom1 , 4 ) is: abcd-1234

The source/destination string sToFrom2 is: abcd-1234-ABCD
The result2 = move ( sToFrom2 , findc , 8 ) is: cd-1234-4-ABCD

char_traits::_Move_s

シーケンス内の文字を、指定された文字数だけ、重複が生じる可能性のある別のシーケンスにコピーします。

static char_type *_Move_s(
    char_type* dest,
    size_t dest_size,
    const char_type* _From,
    size_t count);

パラメーター

dest
コピーされた文字のシーケンスの受信ターゲットとなる文字列または文字配列の先頭にある要素。

dest_size
dest のサイズ。 char_typechar の場合は、バイト単位です。 char_typewchar_t の場合は、ワード数単位です。

_From
コピーされるソース文字列または文字配列の先頭にある要素。

count
ソース文字列からコピーされる要素の数。

戻り値

コピーされた文字のシーケンスの受信ターゲットとなる文字列または文字配列にコピーされる最初の要素 dest

解説

ソースと宛先が重複してもかまいません。

// char_traits__Move_s.cpp
// compile with: /EHsc
#include <string>
#include <iostream>

int main( )
{
    using namespace std;

    char_traits<char>::char_type sFrom1[] =  "abcd-1234-abcd";
    char_traits<char>::char_type sTo1[] =  "ABCD-1234";
    char_traits<char>::char_type* result1;
    cout << "The source string sFrom1 is: " << sFrom1 << endl;
    cout << "The destination stringsTo1 is: " << sTo1 << endl;
    result1 = char_traits<char>::_Move_s(sTo1,
        char_traits<char>::length(sTo1), sFrom1, 4);
    cout << "The result1 = _Move_s(sTo1, "
         << "char_traits<char>::length(sTo1), sFrom1, 4) is: "
         << result1 << endl << endl;

    // When source and destination overlap
    char_traits<char>::char_type sToFrom2[] = "abcd-1234-ABCD";
    char_traits<char>::char_type* result2;
    cout << "The source/destination string sToFrom2 is: "
         << sToFrom2 << endl;
    const char* findc = char_traits<char>::find(sToFrom2, 4, 'c');
    result2 = char_traits<char>::_Move_s(sToFrom2,
        char_traits<char>::length(sToFrom2), findc, 8);
    cout << "The result2 = _Move_s(sToFrom2, "
        << "char_traits<char>::length(sToFrom2), findc, 8) is: "
         << result2 << endl;
}
The source string sFrom1 is: abcd-1234-abcd
The destination stringsTo1 is: ABCD-1234
The result1 = _Move_s(sTo1, char_traits<char>::length(sTo1), sFrom1, 4) is: abcd-1234

The source/destination string sToFrom2 is: abcd-1234-ABCD
The result2 = _Move_s(sToFrom2, char_traits<char>::length(sToFrom2), findc, 8) is: cd-1234-4-ABCD

char_traits::not_eof

文字がファイルの終端 (EOF) 文字であるかどうかをテストします。

static int_type not_eof(const int_type& _Ch);

パラメーター

_Ch
EOF 文字であるかどうかをテストされる int_type として表される文字。

戻り値

文字の int_type が EOF 文字の型と異なる場合、テストされる文字の int_type 表現。

文字 int_type 値が EOF int_type 値と等しい場合は、false です。

// char_traits_not_eof.cpp
// compile with: /EHsc
#include <string>
#include <iostream>

int main( ) {
   using namespace std;

   char_traits<char>::char_type ch1 =  'x';
   char_traits<char>::int_type int1;
   int1 = char_traits<char>:: to_int_type ( ch1 );
   cout << "The char_type ch1 is " << ch1
        << " corresponding to int_type: "
        << int1 << "." << endl;

   // EOF member function
   char_traits <char>::int_type int2 = char_traits<char>::eof ( );
   cout << "The eofReturn is: " << int2 << endl;

   // Testing for EOF or another character
   char_traits <char>::int_type eofTest1, eofTest2;
   eofTest1 = char_traits<char>::not_eof ( int1 );
   if ( !eofTest1 )
      cout << "The eofTest1 indicates ch1 is an EOF character."
              << endl;
   else
      cout << "The eofTest1 returns: " << eofTest1
           << ", which is the character: "
           <<  char_traits<char>::to_char_type ( eofTest1 )
           << "." << endl;

   eofTest2 = char_traits<char>::not_eof ( int2 );
   if ( !eofTest2 )
      cout << "The eofTest2 indicates int2 is an EOF character."
           << endl;
   else
      cout << "The eofTest1 returns: " << eofTest2
           << ", which is the character: "
           <<  char_traits<char>::to_char_type ( eofTest2 )
           << "." << endl;
}
The char_type ch1 is x corresponding to int_type: 120.
The eofReturn is: -1
The eofTest1 returns: 120, which is the character: x.
The eofTest2 indicates int2 is an EOF character.

char_traits::off_type

ストリーム内の位置間のオフセットを表すことのできる整数型。

typedef streamoff off_type;

解説

型は、さまざまなストリーム位置決め操作に関連するオフセット バイト数を格納できるオブジェクトを記述する、符号付き整数です。 通常は、streamoff のシノニムですが、基本的にその型と同じプロパティを持っています。

char_traits::p os_type

ストリーム内の位置を表すことのできる整数型。

typedef streampos pos_type;

解説

この型は、ストリーム内の任意のファイル位置インジケーターを復元するために必要なすべての情報を格納できるオブジェクトを表します。 通常は、streampos のシノニムですが、どのような場合も基本的にその型と同じプロパティを持っています。

char_traits::state_type

ストリーム内のマルチバイト文字の変換状態を表す型。

typedef implementation-defined state_type;

解説

この型は、変換状態を表すことができるオブジェクトを表します。 通常は、mbstate_t のシノニムですが、どのような場合も基本的にその型と同じプロパティを持っています。

char_traits::to_char_type

int_type の文字を char_type の対応する文字に変換し、その結果を返します。

static char_type to_char_type(const int_type& _Ch);

パラメーター

_Ch
char_type として表される int_type 文字。

戻り値

int_type 文字に対応する char_type 文字。

予期しない結果をもたらすようには表されない _Ch の値。

解説

変換操作 to_int_typeto_char_type は互いに逆の操作を実行できるので、次のようになります。

to_int_type ( to_char_type ( x ) ) == x

for any int_typex and

to_char_type ( to_int_type ( x ) ) == x

for any char_typex.

// char_traits_to_char_type.cpp
// compile with: /EHsc
#include <string>
#include <iostream>

int main( )
{
   using namespace std;

   char_traits<char>::char_type ch1 =  'a';
   char_traits<char>::char_type ch2 =  'b';
   char_traits<char>::char_type ch3 =  'a';

   // Converting from char_type to int_type
   char_traits<char>::int_type int1, int2 , int3;
   int1 =char_traits<char>:: to_int_type ( ch1 );
   int2 =char_traits<char>:: to_int_type ( ch2 );
   int3 =char_traits<char>:: to_int_type ( ch3 );

   cout << "The char_types and corresponding int_types are:"
        << "\n    ch1 = " << ch1 << " corresponding to int1 = "
        << int1 << "."
        << "\n    ch2 = " << ch2 << " corresponding to int1 = "
        << int2 << "."
        << "\n    ch3 = " << ch3 << " corresponding to int1 = "
        << int3 << "." << endl << endl;

   // Converting from int_type back to char_type
   char_traits<char>::char_type rec_ch1;
   rec_ch1 = char_traits<char>:: to_char_type ( int1);
   char_traits<char>::char_type rec_ch2;
   rec_ch2 = char_traits<char>:: to_char_type ( int2);

   cout << "The recovered char_types and corresponding int_types are:"
        << "\n    recovered ch1 = " << rec_ch1 << " from int1 = "
        << int1 << "."
        << "\n    recovered ch2 = " << rec_ch2 << " from int2 = "
        << int2 << "." << endl << endl;

   // Testing that the conversions are inverse operations
   bool b1 = char_traits<char>::eq ( rec_ch1 , ch1 );
   if ( b1 )
      cout << "The recovered char_type of ch1"
           << " is equal to the original ch1." << endl;
   else
      cout << "The recovered char_type of ch1"
           << " is not equal to the original ch1." << endl;

   // An equivalent and alternatively test procedure
   if ( rec_ch2 == ch2 )
      cout << "The recovered char_type of ch2"
           << " is equal to the original ch2." << endl;
   else
      cout << "The recovered char_type of ch2"
           << " is not equal to the original ch2." << endl;
}
The char_types and corresponding int_types are:
    ch1 = a corresponding to int1 = 97.
    ch2 = b corresponding to int1 = 98.
    ch3 = a corresponding to int1 = 97.

The recovered char_types and corresponding int_types are:
    recovered ch1 = a from int1 = 97.
    recovered ch2 = b from int2 = 98.

The recovered char_type of ch1 is equal to the original ch1.
The recovered char_type of ch2 is equal to the original ch2.

char_traits::to_int_type

char_type の文字を int_type の対応する文字に変換し、その結果を返します。

static int_type to_int_type(const char_type& _Ch);

パラメーター

_Ch
int_type として表される char_type 文字。

戻り値

char_type 文字に対応する int_type 文字。

解説

変換操作 to_int_typeto_char_type は互いに逆の操作を実行できるので、次のようになります。

to_int_type ( to_char_type ( x ) ) == x

for any int_typex and

to_char_type ( to_int_type ( x ) ) == x

for any char_typex.

// char_traits_to_int_type.cpp
// compile with: /EHsc
#include <string>
#include <iostream>

int main( )
{
   using namespace std;
   char_traits<char>::char_type ch1 = 'a';
   char_traits<char>::char_type ch2 = 'b';
   char_traits<char>::char_type ch3 = 'a';

   // Converting from char_type to int_type
   char_traits<char>::int_type int1, int2 , int3;
   int1 =char_traits<char>:: to_int_type ( ch1 );
   int2 =char_traits<char>:: to_int_type ( ch2 );
   int3 =char_traits<char>:: to_int_type ( ch3 );

   cout << "The char_types and corresponding int_types are:"
        << "\n    ch1 = " << ch1 << " corresponding to int1 = "
        << int1 << "."
        << "\n    ch2 = " << ch2 << " corresponding to int1 = "
        << int2 << "."
        << "\n    ch3 = " << ch3 << " corresponding to int1 = "
        << int3 << "." << endl << endl;

   // Converting from int_type back to char_type
   char_traits<char>::char_type rec_ch1;
   rec_ch1 = char_traits<char>:: to_char_type ( int1);
   char_traits<char>::char_type rec_ch2;
   rec_ch2 = char_traits<char>:: to_char_type ( int2);

   cout << "The recovered char_types and corresponding int_types are:"
        << "\n    recovered ch1 = " << rec_ch1 << " from int1 = "
        << int1 << "."
        << "\n    recovered ch2 = " << rec_ch2 << " from int2 = "
        << int2 << "." << endl << endl;

   // Testing that the conversions are inverse operations
   bool b1 = char_traits<char>::eq ( rec_ch1 , ch1 );
   if ( b1 )
      cout << "The recovered char_type of ch1"
           << " is equal to the original ch1." << endl;
   else
      cout << "The recovered char_type of ch1"
           << " is not equal to the original ch1." << endl;

   // An equivalent and alternatively test procedure
   if ( rec_ch2 == ch2 )
      cout << "The recovered char_type of ch2"
           << " is equal to the original ch2." << endl;
   else
      cout << "The recovered char_type of ch2"
           << " is not equal to the original ch2." << endl;
}
The char_types and corresponding int_types are:
    ch1 = a corresponding to int1 = 97.
    ch2 = b corresponding to int1 = 98.
    ch3 = a corresponding to int1 = 97.

The recovered char_types and corresponding int_types are:
    recovered ch1 = a from int1 = 97.
    recovered ch2 = b from int2 = 98.

The recovered char_type of ch1 is equal to the original ch1.
The recovered char_type of ch2 is equal to the original ch2.

関連項目

C++ 標準ライブラリ内のスレッド セーフ