char_traits – struktura
Struktura char_traits popisuje atributy přidružené ke znaku.
Syntaxe
template <class CharType>
struct char_traits;
Parametry
CharType
Datový typ elementu.
Poznámky
Struktura šablony popisuje různé znakové vlastnosti pro typ CharType
. Šablona třídy basic_string i několik šablon tříd iostream, včetně basic_ios, používají tyto informace k manipulaci s prvky typu CharType
. Takový typ prvku nesmí vyžadovat explicitní konstrukci nebo zničení. Musí zadat výchozí konstruktor, konstruktor kopírování a operátor přiřazení s očekávanou sémantikou. Bitová kopie musí mít stejný účinek jako přiřazení. Žádná z členských funkcí struktury char_traits nemůže vyvolat výjimky.
Typedefs
Název typu | Popis |
---|---|
char_type | Typ znaku. |
int_type | Celočíselná hodnota, která může představovat znak typu char_type nebo znak konce souboru (EOF). |
off_type | Celočíselná hodnota, která může představovat posuny mezi pozicemi v datovém proudu. |
pos_type | Celočíselné typy, které mohou představovat pozice v datovém proudu. |
state_type | Typ, který představuje stav převodu pro vícebajtové znaky v datovém proudu. |
Členské funkce
Členová funkce | Popis |
---|---|
přiřadit | Přiřadí jednu znakové hodnoty k druhé. |
porovnat | Porovná až zadaný počet znaků ve dvou řetězcích. |
kopírovat | Zkopíruje zadaný počet znaků z jednoho řetězce do druhého. Zastaralé Místo toho použijte char_traits::_Copy_s . |
_Copy_s | Zkopíruje zadaný počet znaků z jednoho řetězce do druhého. |
eof | Vrátí znak konce souboru (EOF). |
Eq | Testuje, zda jsou dva char_type znaky stejné. |
eq_int_type | Testuje, zda jsou dva znaky reprezentované jako int_type znaky stejné. |
find | Vyhledá první výskyt zadaného znaku v rozsahu znaků. |
length | Vrátí délku řetězce. |
lt | Testuje, zda je jeden znak menší než druhý. |
pohnout | Zkopíruje zadaný počet znaků v sekvenci do jiné, možné překrývající se sekvence. Zastaralé Místo toho použijte char_traits::_Move_s . |
_Move_s | Zkopíruje zadaný počet znaků v sekvenci do jiné, možné překrývající se sekvence. |
not_eof | Testuje, zda je znak koncem souboru (EOF). |
to_char_type | Převede int_type znak na odpovídající char_type znak a vrátí výsledek. |
to_int_type | Převede char_type znak na odpovídající int_type znak a vrátí výsledek. |
Požadavky
Header:<string>
Obor názvů: std
char_traits::assign
Přiřadí jednu znakovou hodnotu jinému nebo rozsahu prvků v řetězci.
static void assign(char_type& _CharTo,
const char_type& _CharFrom);
static char_type *assign(char_type* strTo,
size_t _Num,
char_type _CharFrom);
Parametry
_ CharFrom Znak, jehož hodnota má být přiřazena.
_CharTo
Prvek, který má být přiřazen hodnotu znaku.
strTo
Řetězcové nebo znakové pole, jehož počáteční prvky mají být přiřazeny hodnoty znaků.
_Num
Počet prvků, které budou přiřazeny hodnoty.
Návratová hodnota
Druhá členová funkce vrátí ukazatel na řetězec, jehož první _Num prvky byly přiřazeny hodnoty _CharFrom.
Příklad
// 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
Typ znaku.
typedef CharType char_type;
Poznámky
Typ je synonymem pro parametr CharType
šablony .
Příklad
Příklad, jak deklarovat a používatchar_type
, najdete v příkladu kopírování .
char_traits::compare
Porovná až zadaný počet znaků ve dvou řetězcích.
static int compare(const char_type* str1,
const char_type* str2,
size_t _Num);
Parametry
str1
První ze dvouřetězcůch
str2
Druhá ze dvou řetězců, které se mají porovnat mezi sebou.
_Num
Počet prvků v řetězcích, které se mají porovnat.
Návratová hodnota
Záporná hodnota, pokud je první řetězec menší než druhý řetězec, 0, pokud jsou dva řetězce stejné, nebo kladná hodnota, pokud je první řetězec větší než druhý řetězec.
Poznámky
Porovnání řetězců je tvořeno elementem, nejprve testuje rovnost a pak, pokud se dvojice prvků v sekvenčních testech nerovná, testují se pro méně než.
Pokud se dva řetězce porovnávají s rozsahem, ale jeden je delší než druhý, je kratší než ten delší.
Příklad
// 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
Zkopíruje zadaný počet znaků z jednoho řetězce do druhého.
Tato metoda je potenciálně nebezpečná, protože volající spoléhá na kontrolu správnosti předaných hodnot. Zvažte místo toho použití char_traits::_Copy_s .
static char_type *copy(char_type* _To,
const char_type* _From,
size_t _Num);
Parametry
_K
Prvek na začátku řetězce nebo pole znaků určeného pro příjem zkopírované sekvence znaků.
_Od
Prvek na začátku zdrojového řetězce nebo pole znaků, které se mají zkopírovat.
_Num
Počet prvků, které se mají zkopírovat.
Návratová hodnota
První prvek zkopírovaný do řetězce nebo pole znaků cílené na příjem zkopírované sekvence znaků.
Poznámky
Sekvence zdrojových a cílových znaků se nesmí překrývat.
Příklad
// 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
Zkopíruje zadaný počet znaků z jednoho řetězce do druhého.
static char_type *_Copy_s(
char_type* dest,
size_t dest_size,
const char_type* _From,
size_t count);
Parametry
dest
Řetězec nebo pole znaků cílené na příjem zkopírované sekvence znaků.
dest_size
Velikost dest. Pokud char_type
ano char
, je tato velikost v bajtech. Pokud char_type
je wchar_t
, pak tato velikost je ve slovech.
_Od
Zdrojový řetězec nebo pole znaků, které se mají zkopírovat.
count
Počet prvků, které se mají zkopírovat.
Návratová hodnota
Řetězec nebo pole znaků cílené na příjem zkopírované sekvence znaků.
Poznámky
Sekvence zdrojových a cílových znaků se nesmí překrývat.
Příklad
// 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
Vrátí znak konce souboru (EOF).
static int_type eof();
Návratová hodnota
Znak EOF.
Poznámky
Hodnota, která představuje konec souboru (například EOF nebo WEOF).
Standardní jazyk C++ uvádí, že tato hodnota nesmí odpovídat platné char_type
hodnotě. Kompilátor jazyka Microsoft C++ vynucuje toto omezení pro typ char
, ale ne pro typ wchar_t
. To zachycuje níže uvedený příklad.
Příklad
// 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
Testuje, zda jsou dva char_type
znaky stejné.
static bool eq(const char_type& _Ch1, const char_type& _Ch2);
Parametry
_Ch1
První zedvouch
_Ch2
Druhý ze dvou znaků, které se mají testovat na rovnost.
Návratová hodnota
true
je-li první znak roven druhému znaku; jinak false
.
Příklad
// 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
Testuje, zda jsou dva znaky reprezentované jako int_type
znaky stejné nebo ne.
static bool eq_int_type(const int_type& _Ch1, const int_type& _Ch2);
Parametry
_Ch1
První ze dvou znaků, které mají být testovány na rovnost jako int_type
s.
_Ch2
Druhá ze dvou znaků, které se mají testovat na rovnost jako int_type
s.
Návratová hodnota
true
je-li první znak roven druhému znaku; jinak false
.
Příklad
// 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
Vyhledá první výskyt zadaného znaku v rozsahu znaků.
static const char_type* find(const char_type* str,
size_t _Num,
const char_type& _Ch);
Parametry
Str
První znak v řetězci, který se má prohledávat.
_Num
Počet pozic, které se počítají od prvního, v rozsahu, který se má prohledávat.
_Ch
Znak, který se má vyhledat v oblasti.
Návratová hodnota
Ukazatel na první výskyt zadaného znaku v oblasti, pokud je nalezena shoda; v opačném případě je ukazatel null.
Příklad
// 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
Celočíselná hodnota, která může představovat znak typu char_type
nebo znak konce souboru (EOF).
typedef long int_type;
Poznámky
Musí být možné přetypovat hodnotu typu CharType
tak, aby int_type
se vrátila zpět CharType
beze změny původní hodnoty.
Příklad
Podívejte se na příklad eq_int_type příklad, jak deklarovat a používat int_type
.
char_traits::length
Vrátí délku řetězce.
static size_t length(const char_type* str);
Parametry
Str
Řetězec C, jehož délka se měří.
Návratová hodnota
Počet prvků v sekvenci, které se měří, nezahrnuje ukončovací znak null.
Příklad
// 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
Testuje, zda je jeden znak menší než druhý.
static bool lt(const char_type& _Ch1, const char_type& _Ch2);
Parametry
_Ch1
První ze dvou znaků, které se mají testovat na méně než
_Ch2
Druhý ze dvou znaků, které se mají testovat na méně než.
Návratová hodnota
true
je-li první znak menší než druhý znak; jinak false
.
Příklad
// 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
Zkopíruje zadaný počet znaků v sekvenci do jiné, případně překrývající se sekvence.
Tato metoda je potenciálně nebezpečná, protože volající spoléhá na kontrolu správnosti předaných hodnot. Zvažte místo toho použití char_traits::_Move_s .
static char_type *move(char_type* _To,
const char_type* _From,
size_t _Num);
Parametry
_K
Prvek na začátku řetězce nebo pole znaků určeného pro příjem zkopírované sekvence znaků.
_Od
Prvek na začátku zdrojového řetězce nebo pole znaků, které se mají zkopírovat.
_Num
Počet prvků, které se mají zkopírovat ze zdrojového řetězce.
Návratová hodnota
První prvek _To zkopírován do řetězce nebo pole znaků cíleného na příjem zkopírované sekvence znaků.
Poznámky
Zdroj a cíl se můžou překrývat.
Příklad
// 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
Zkopíruje zadaný počet znaků v sekvenci do jiné, případně překrývající se sekvence.
static char_type *_Move_s(
char_type* dest,
size_t dest_size,
const char_type* _From,
size_t count);
Parametry
dest
Prvek na začátku řetězce nebo pole znaků určeného pro příjem zkopírované sekvence znaků.
dest_size
Velikost dest. Pokud char_type
ano char
, je to v bajtech. Pokud char_type
je wchar_t
, pak je to ve slovech.
_Od
Prvek na začátku zdrojového řetězce nebo pole znaků, které se mají zkopírovat.
count
Počet prvků, které se mají zkopírovat ze zdrojového řetězce.
Návratová hodnota
První prvek se zkopíruje do řetězce nebo pole znaků cílené na příjem zkopírované sekvence znaků.
Poznámky
Zdroj a cíl se můžou překrývat.
Příklad
// 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
Testuje, zda znak není znakem konce souboru (EOF), nebo je EOF.
static int_type not_eof(const int_type& _Ch);
Parametry
_Ch
Znak reprezentovaný jako int_type
testovaný, zda se jedná o znak EOF, nebo ne.
Návratová hodnota
Reprezentace int_type
testovaného znaku, pokud int_type
znak není roven znaku EOF.
Pokud je hodnota znaku int_type
rovna hodnotě EOF int_type
, pak false
.
Příklad
// 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
Celočíselná hodnota, která může představovat posuny mezi pozicemi v datovém proudu.
typedef streamoff off_type;
Poznámky
Typ je podepsané celé číslo, které popisuje objekt, který může uložit posun bajtů zahrnutý v různých operacích umístění datového proudu. Obvykle se jedná o synonymum pro streamoff, ale má v podstatě stejné vlastnosti jako tento typ.
char_traits::p os_type
Celočíselné typy, které mohou představovat pozice v datovém proudu.
typedef streampos pos_type;
Poznámky
Tento typ popisuje objekt, který může ukládat všechny informace potřebné k obnovení libovolného indikátoru pozice souboru v rámci datového proudu. Obvykle se jedná o synonymum pro streampos, ale v každém případě má v podstatě stejné vlastnosti jako tento typ.
char_traits::state_type
Typ, který představuje stav převodu pro vícebajtové znaky v datovém proudu.
typedef implementation-defined state_type;
Poznámky
Typ popisuje objekt, který může představovat stav převodu. Obvykle se jedná o synonymum pro mbstate_t
, ale v každém případě má v podstatě stejné vlastnosti jako tento typ.
char_traits::to_char_type
Převede int_type
znak na odpovídající char_type
znak a vrátí výsledek.
static char_type to_char_type(const int_type& _Ch);
Parametry
_Ch
Znak int_type
, který má být reprezentován jako char_type
znak .
Návratová hodnota
Znak char_type
odpovídající znaku int_type
.
Hodnota _Ch , která nemůže být reprezentována jako taková, přináší nezadanou hodnotu.
Poznámky
Převodní operace to_int_type a to_char_type
jsou mezi sebou inverzní, takže:
to_int_type
( ( to_char_type
x ) == x
pro libovolnou int_type
x a
to_char_type
( ( to_int_type
x ) == x
pro libovolnou char_type
x.
Příklad
// 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
Převede char_type
znak na odpovídající int_type
znak a vrátí výsledek.
static int_type to_int_type(const char_type& _Ch);
Parametry
_Ch
Znak char_type
, který má být reprezentován jako znak int_type
.
Návratová hodnota
Znak int_type
odpovídající znaku char_type
.
Poznámky
Operace to_int_type
převodu a to_char_type jsou mezi sebou inverzní, takže:
to_int_type
( ( to_char_type
x ) == x
pro libovolnou int_type
x a
to_char_type
( ( to_int_type
x ) == x
pro libovolnou char_type
x.
Příklad
// 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.