basic_istream
クラス
Char_T
型の要素を含むストリーム バッファーからの要素とエンコードされたオブジェクトの抽出を制御するオブジェクトを表します。この型は char_type
とも呼ばれ、その文字特性は、traits_type
とも呼ばれるクラス Tr
によって決定されます。
構文
template <class Char_T, class Tr = char_traits<Char_T>>
class basic_istream : virtual public basic_ios<Char_T, Tr>
解説
operator>>
をオーバーロードするメンバー関数のほとんどは、書式設定された入力関数です。 これらは以下のパターンに従います。
iostate state = goodbit;
const sentry ok(*this);
if (ok)
{
try
{
/*extract elements and convert
accumulate flags in state.
store a successful conversion*/
}
catch (...)
{
try
{
setstate(badbit);
}
catch (...)
{
}
if ((exceptions()& badbit) != 0)
throw;
}
}
setstate(state);
return (*this);
その他のメンバー関数の多くは、書式が設定されていない入力関数です。 これらは以下のパターンに従います。
iostate state = goodbit;
count = 0; // the value returned by gcount
const sentry ok(*this, true);
if (ok)
{
try
{
/* extract elements and deliver
count extracted elements in count
accumulate flags in state */
}
catch (...)
{
try
{
setstate(badbit);
}
catch (...)
{
}
if ((exceptions()& badbit) != 0)
throw;
}
}
setstate(state);
要素の抽出中にファイルの終わりに到達した場合、どちらの関数グループも setstate(eofbit)
を呼び出します。 詳細については、setstate
を参照してください。
クラス basic_istream<Char_T, Tr>
ストアのオブジェクト:
クラス
basic_ios<Char_T, Tr>
の仮想パブリック基本オブジェクト。 詳細については、basic_ios
を参照してください。最後の書式設定されていない入力操作の抽出カウント (以前のコードで
count
と呼ばれていたもの)。
例
入力ストリームの詳細については、basic_ifstream
クラスの例を参照してください。
コンストラクター
コンストラクター | 説明 |
---|---|
basic_istream |
basic_istream 型のオブジェクトを構築します。 |
メンバー関数
メンバー関数 | 説明 |
---|---|
gcount |
書式設定されていない最後の入力中に読まれた文字数を返します。 |
get |
入力ストリームから 1 つ以上の文字を読み取ります。 |
getline |
入力ストリームから行を読み取ります。 |
ignore |
複数の要素を、現在読み取った位置からスキップさせます。 |
peek |
読み取る次の文字を返します。 |
putback |
ストリームに指定された文字を配置します。 |
read |
指定された数の文字をストリームから読み取り、配列に保存します。 |
readsome |
バッファーからのみ読み取ります。 |
seekg |
ストリームでの読み取り位置を移動させます。 |
sentry |
この入れ子になったクラスは、オブジェクトの宣言が書式設定された入力関数と書式設定されていない入力関数を構築するオブジェクトについて記述します。 |
swap |
この basic_istream オブジェクトを、指定した basic_istream オブジェクト パラメーターと交換します。 |
sync |
ストリームに関連付けられた入力デバイスをストリームのバッファーと同期します。 |
tellg |
ストリーム内の現在の読み取り位置を報告します。 |
unget |
最後に読み取った文字をストリームに戻します。 |
演算子
演算子 | 説明 |
---|---|
operator>> |
入力ストリームで関数を呼び出すか、または入力ストリームから書式設定されたデータを読み取ります。 |
operator= |
演算子の右辺の basic_istream をこのオブジェクトに代入します。 これは、コピーを残さない rvalue 参照を伴う移動代入です。 |
要件
ヘッダー: <istream>
名前空間: std
basic_istream::basic_istream
basic_istream
型のオブジェクトを構築します。
explicit basic_istream(
basic_streambuf<Char_T, Tr>* strbuf,
bool _Isstd = false);
basic_istream(basic_istream&& right);
パラメーター
strbuf
basic_streambuf 型のオブジェクト。
_Isstd
これが標準ストリームの場合は true
、それ以外の場合は false
。
right
コピーする basic_istream
オブジェクト。
解説
最初のコンストラクターが init(strbuf)
を呼び出して基底クラスを初期化します。 ゼロも抽出カウントに格納されます。 詳細については、init
を参照してください。 この抽出カウントの詳細については、「basic_istream
クラス」の概要の「コメント」セクションを参照してください。
2 番目のコンストラクターが move(right)
を呼び出して基底クラスを初期化します。 また、抽出カウントに right.gcount()
を格納し、 right
の抽出数に 0 を格納します。
例
入力ストリームの詳細については、basic_ifstream::basic_ifstream
の例を参照してください。
basic_istream::gcount
書式設定されていない最後の入力中に読まれた文字数を返します。
streamsize gcount() const;
戻り値
抽出カウント。
解説
basic_istream::get
を使用して、書式設定されていない文字を読み取ります。
例
// basic_istream_gcount.cpp
// compile with: /EHsc
#include <iostream>
using namespace std;
int main( )
{
cout << "Type the letter 'a': ";
ws( cin );
char c[10];
cin.get( &c[0],9 );
cout << c << endl;
cout << cin.gcount( ) << endl;
}
a
Type the letter 'a': a
1
basic_istream::get
入力ストリームから 1 つ以上の文字を読み取ります。
int_type get();
basic_istream<Char_T, Tr>& get(Char_T& Ch);
basic_istream<Char_T, Tr>& get(Char_T* str, streamsize count);
basic_istream<Char_T, Tr>& get(Char_T* str, streamsize count, Char_T delimiter);
basic_istream<Char_T, Tr>& get(basic_streambuf<Char_T, Tr>& strbuf);
basic_istream<Char_T, Tr>& get(basic_streambuf<Char_T, Tr>& strbuf, Char_T delimiter);
パラメーター
count
strbuf
から読み取る文字の数。
delimiter
count
する前に読み取りが発生した場合に読み取りを終了する必要がある文字。
str
書き込み先の文字列。
Ch
取得する文字。
strbuf
書き込み先のバッファー。
戻り値
get
のパラメーターなしの形式では、整数またはファイルの終わりとして読み取られる要素を返します。 残りのフォームはストリーム (*this
) を返します。
解説
最初の書式設定されていない入力関数は、可能であれば、rdbuf->sbumpc
を返すように、要素を抽出します。 それ以外の場合は traits_type::
eof
を返します。 この関数は要素を抽出しない場合、setstate(failbit)
を呼び出します。 詳細については、setstate
を参照してください。
2 番目の関数では、同じ方法で int_type
要素 meta
を抽出します。 meta
が traits_type::eof
と等しい場合、関数は setstate(failbit)
を呼び出します。 それ以外の場合は、traits_type::to_char_type(meta)
を Ch
に格納します。 *this
が返されます。 詳細については、to_char_type
を参照してください。
3 番目の関数は、get(str, count, widen('\n'))
を返します。
4 番目の関数では、最大 count - 1
の要素を抽出し、それらを str
で始まる配列に格納します。 これは格納する抽出した要素の後に常に char_type
を格納します。 テストの順に抽出は停止します。
ファイルの終わり。
関数が
delimiter
と等しい要素を抽出した後。 この場合、この要素は制御されたシーケンスに戻されます。関数が
count - 1
要素を抽出した後。
この関数は要素を抽出しない場合、setstate(failbit)
を呼び出します。 いずれの場合も、*this
を返します。
5 番目の関数は get(strbuf, widen('\n'))
を返します。
6 番目の関数は要素を抽出し、 strbuf
に挿入します。 抽出は、ファイルの終わり、または抽出されない delimiter
と等しい要素で停止します。 また、挿入が失敗した場合または (キャッチされるが再スローされない) 例外をスローする場合は、対象の要素を抽出せずに停止します。 この関数は要素を抽出しない場合、setstate(failbit)
を呼び出します。 いずれの場合も、関数は *this
を返します。
例
// basic_istream_get.cpp
// compile with: /EHsc
#include <iostream>
using namespace std;
int main( )
{
char c[10];
c[0] = cin.get( );
cin.get( c[1] );
cin.get( &c[2],3 );
cin.get( &c[4], 4, '7' );
cout << c << endl;
}
1111
basic_istream::getline
入力ストリームから行を取得します。
basic_istream<Char_T, Tr>& getline(
char_type* str,
streamsize count);
basic_istream<Char_T, Tr>& getline(
char_type* str,
streamsize count,
char_type delimiter);
パラメーター
count
strbuf
から読み取る文字の数。
delimiter
count
する前に読み取りが発生した場合に読み取りを終了する必要がある文字。
str
書き込み先の文字列。
戻り値
ストリーム (*this
)。
解説
これらの書式設定されていない最初の入力関数は、getline(str, count, widen('\n'))
を返します。
2 番目の関数では、最大 count - 1
の要素を抽出し、それらを str
で始まる配列に格納します。 これは格納する抽出した要素の後に常に文字列終端文字を格納します。 テストの順に抽出は停止します。
ファイルの終わり。
関数が
delimiter
と等しい要素を抽出した後。 この場合、要素は戻されず、制御されたシーケンスに追加されません。関数が
count - 1
要素を抽出した後。
関数が要素を抽出しなかった場合、または count - 1
要素を抽出した場合は、setstate(failbit)
を呼び出します。 いずれの場合も、*this
を返します。 詳細については、setstate
を参照してください。
例
// basic_istream_getline.cpp
// compile with: /EHsc
#include <iostream>
using namespace std;
int main( )
{
char c[10];
cin.getline( &c[0], 5, '2' );
cout << c << endl;
}
121
basic_istream::ignore
複数の要素を、現在読み取った位置からスキップさせます。
basic_istream<Char_T, Tr>& ignore(
streamsize count = 1,
int_type delimiter = traits_type::eof());
パラメーター
count
現在の読み取り位置からスキップする要素の数。
delimiter
カウントの前に出現した場合には ignore
を返し、delimiter
の後のすべての要素の読み取りを許可する要素。
戻り値
ストリーム (*this
)。
解説
書式設定されていない入力関数は、最大 count
の要素を抽出し、これらを破棄します。 ただし、count
が numeric_limits<int>::max
と等しい場合、任意の大きさとして取得されます。 抽出は、traits_type::to_int_type(Ch)
が (同じく抽出された) delimiter
と等しくなるように、ファイルの終わりまたは要素 Ch
の早い段階で停止します。 *this
が返されます。 詳細については、to_int_type
を参照してください。
例
// basic_istream_ignore.cpp
// compile with: /EHsc
#include <iostream>
int main( )
{
using namespace std;
char chararray[10];
cout << "Type 'abcdef': ";
cin.ignore( 5, 'c' );
cin >> chararray;
cout << chararray;
}
Type 'abcdef': abcdef
def
basic\_istream::operator>>
入力ストリームで関数を呼び出すか、または入力ストリームから書式設定されたデータを読み取ります。
basic_istream& operator>>(basic_istream& (* Pfn)(basic_istream&));
basic_istream& operator>>(ios_base& (* Pfn)(ios_base&));
basic_istream& operator>>(basic_ios<Char_T, Tr>& (* Pfn)(basic_ios<Char_T, Tr>&));
basic_istream& operator>>(basic_streambuf<Char_T, Tr>* strbuf);
basic_istream& operator>>(bool& val);
basic_istream& operator>>(short& val);
basic_istream& operator>>(unsigned short& val);
basic_istream& operator>>(int& val);
basic_istream& operator>>(unsigned int& val);
basic_istream& operator>>(long& val);
basic_istream& operator>>(unsigned long& val);
basic_istream& operator>>(long long& val);
basic_istream& operator>>(unsigned long long& val);
basic_istream& operator>>(void *& val);
basic_istream& operator>>(float& val);
basic_istream& operator>>(double& val);
basic_istream& operator>>(long double& val);
パラメーター
Pfn
関数ポインター。
strbuf
stream_buf
型オブジェクト。
val
ストリームから読み取る値。
戻り値
ストリーム (*this
)。
解説
<istream>
ヘッダーは複数のグローバル抽出演算子も定義します。 詳細については、operator>> (\<istream>)
を参照してください。
最初のメンバー関数では、istr >> ws
形式の式によって ws(istr)
が呼び出され、*this
が返されることを保証します。 詳細については、ws
を参照してください。
2 番目と 3 番目の関数は、hex
などの他のマニピュレーターが同じように動作することを保証します。 残りの関数は、書式設定された入力関数です。
関数は、次のことを行います。
basic_istream& operator>>(
basic_streambuf<Char_T, Tr>* strbuf);
strbuf
が null ポインターでない場合は要素を抽出し、strbuf
に挿入します。 抽出は、ファイルの終わりで停止します。 また、挿入が失敗した場合または (キャッチされるが再スローされない) 例外をスローする場合は、対象の要素を抽出せずに停止します。 この関数は要素を抽出しない場合、setstate(failbit)
を呼び出します。 いずれの場合も、関数は *this
を返します。 詳細については、setstate
を参照してください。
関数は、次のことを行います。
basic_istream& operator>>(bool& val);
フィールドを抽出し、use_facet< num_get<Char_T, InIt>(getloc).get( InIt(rdbuf), Init(0), *this, getloc, val)
を呼び出してブール値に変換します。 ここで、InIt
は istreambuf_iterator<Char_T, Tr>
として定義されます。 *this
が返されます。
詳細については、use_facet
、getloc
、get
、rdbuf
、istreambuf_iterator
を参照してください。
次の各関数は、
basic_istream& operator>>(short& val);
basic_istream& operator>>(unsigned short& val);
basic_istream& operator>>(int& val);
basic_istream& operator>>(unsigned int& val);
basic_istream& operator>>(long& val);
basic_istream& operator>>(unsigned long& val);
basic_istream& operator>>(long long& val);
basic_istream& operator>>(unsigned long long& val);
basic_istream& operator>>(void *& val);
フィールドを抽出し、use_facet<num_get<Char_T, InIt>(getloc).get(InIt(rdbuf), Init(0), *this, getloc, val)
を呼び出して数値に変換します。 ここでは、InIt
は istreambuf_iterator<Char_T, Tr>
として定義され、val
の型は必要に応じて long
、unsigned long
、または void *
になります。
変換後の値を val
の型として表すことができない場合、関数では setstate(failbit)
を呼び出します。 いずれの場合も、関数は *this
を返します。 詳細については、setstate
を参照してください。
次の各関数は、
basic_istream& operator>>(float& val);
basic_istream& operator>>(double& val);
basic_istream& operator>>(long double& val);
フィールドを抽出し、use_facet<num_get<Char_T, InIt>(getloc).get(InIt(rdbuf), Init(0), *this, getloc, val)
を呼び出して数値に変換します。 ここでは、InIt
は istreambuf_iterator<Char_T, Tr>
として定義され、val
の型は必要に応じて double
または long double
になります。
変換後の値を val
の型として表すことができない場合、関数では setstate(failbit)
を呼び出します。 いずれの場合も、*this
を返します。
例
// istream_basic_istream_op_is.cpp
// compile with: /EHsc
#include <iostream>
using namespace std;
ios_base& hex2( ios_base& ib )
{
ib.unsetf( ios_base::dec );
ib.setf( ios_base::hex );
return ib;
}
basic_istream<char, char_traits<char> >& somefunc(basic_istream<char, char_traits<char> > &i)
{
if ( i == cin )
{
cerr << "i is cin" << endl;
}
return i;
}
int main( )
{
int i = 0;
cin >> somefunc;
cin >> i;
cout << i << endl;
cin >> hex2;
cin >> i;
cout << i << endl;
}
basic_istream::operator=
演算子の右辺の basic_istream
をこのオブジェクトに代入します。 これは、コピーを残さない rvalue
参照を伴う移動代入です。
basic_istream& operator=(basic_istream&& right);
パラメーター
right
basic_ifstream
オブジェクトへの rvalue
参照。
戻り値
*this
を返します。
解説
このメンバー演算子は、swap(right)
を呼び出します。
basic_istream::peek
読み取る次の文字を返します。
int_type peek();
戻り値
読み取る次の文字。
解説
これらの書式設定されていない入力関数は、可能であれば、rdbuf->sgetc
を返すように、要素を抽出します。 それ以外の場合は traits_type::eof
を返します。 詳細については、次のトピックを参照してください。 sgetc
および eof
例
// basic_istream_peek.cpp
// compile with: /EHsc
#include <iostream>
using namespace std;
int main( )
{
char c[10], c2;
cout << "Type 'abcde': ";
c2 = cin.peek( );
cin.getline( &c[0], 9 );
cout << c2 << " " << c << endl;
}
abcde
Type 'abcde': abcde
a abcde
basic_istream::putback
ストリームに指定された文字を配置します。
basic_istream<Char_T, Tr>& putback(
char_type Ch);
パラメーター
Ch
ストリームに戻す文字。
戻り値
ストリーム (*this
)。
解説
書式設定されていない入力関数では、可能な場合には rdbuf->sputbackc
を呼び出すのと同じように Ch
を戻します。 rdbuf
が Null ポインターの場合、または sputbackc
の呼び出しが traits_type::eof
を返す場合、関数は setstate(badbit)
を呼び出します。 いずれの場合も、*this
を返します。
詳細については、「rdbuf
」、「sputbackc
」、「eof
」、および「setstate
」を参照してください。
例
// basic_istream_putback.cpp
// compile with: /EHsc
#include <iostream>
using namespace std;
int main( )
{
char c[10], c2, c3;
c2 = cin.get( );
c3 = cin.get( );
cin.putback( c2 );
cin.getline( &c[0], 9 );
cout << c << endl;
}
qwq
basic_istream::read
指定された数の文字をストリームから読み取り、配列に保存します。
渡された値が正しいことの確認を呼び出し元に依存するため、このメソッドは安全ではない可能性があります。
basic_istream<Char_T, Tr>& read(
char_type* str,
streamsize count);
パラメーター
str
文字の読み取り先の配列。
count
読み取る文字の数。
戻り値
ストリーム ( *this
)。
解説
書式設定されていない入力関数では、最大 count
の要素を抽出し、それらを str
で始まる配列に格納します。 抽出はファイルの終わりの早い段階で停止します。この場合、関数は setstate(failbit)
を呼び出します。 いずれの場合も、*this
を返します。 詳細については、setstate
を参照してください。
例
// basic_istream_read.cpp
// compile with: /EHsc
#include <iostream>
using namespace std;
int main()
{
char c[10];
int count = 5;
cout << "Type 'abcde': ";
// Note: cin::read is potentially unsafe, consider
// using cin::_Read_s instead.
cin.read(&c[0], count);
c[count] = 0;
cout << c << endl;
}
abcde
Type 'abcde': abcde
abcde
basic_istream::readsome
指定した文字の値の数を読み取ります。
渡された値が正しいことの確認を呼び出し元に依存するため、このメソッドは安全ではない可能性があります。
streamsize readsome(
char_type* str,
streamsize count);
パラメーター
str
readsome
が読み取る文字を格納する配列。
count
読み取る文字の数。
戻り値
実際に読み取った文字数、gcount
。
解説
この書式設定されていない入力関数は、最大 count
の要素を入力ストリームから抽出し、それらを配列 str
に格納します。
この関数は入力を待機しません。 使用できる任意のデータを読み取ります。
例
// basic_istream_readsome.cpp
// compile with: /EHsc /W3
#include <iostream>
using namespace std;
int main( )
{
char c[10];
int count = 5;
cout << "Type 'abcdefgh': ";
// cin.read blocks until user types input.
// Note: cin::read is potentially unsafe, consider
// using cin::_Read_s instead.
cin.read(&c[0], 2);
// Note: cin::readsome is potentially unsafe, consider
// using cin::_Readsome_s instead.
int n = cin.readsome(&c[0], count); // C4996
c[n] = 0;
cout << n << " characters read" << endl;
cout << c << endl;
}
basic_istream::seekg
ストリームでの読み取り位置を移動させます。
basic_istream<Char_T, Tr>& seekg(pos_type pos);
basic_istream<Char_T, Tr>& seekg(off_type off, ios_base::seekdir way);
パラメーター
pos
読み取りポインターの移動先の絶対位置。
off
way
に対して相対的に読み取りポインターを移動するオフセット。
way
ios_base::seekdir
列挙体の 1 つ。
戻り値
ストリーム (*this
)。
解説
1 つ目のメンバー関数は絶対シークを実行し、2 つ目のメンバー関数は相対シークを実行します。
Note
標準 C++ ではテキスト ファイルでの相対シークをサポートしていないため、2 つ目のメンバー関数をテキスト ファイルで使用しないでください。
fail
が false
の場合、最初のメンバー関数では、一部の pos_type
一時オブジェクト newpos
に対して newpos = rdbuf->pubseekpos(pos)
を呼び出します。 fail
が false
の場合、2 番目の関数では newpos = rdbuf->pubseekoff( off, way)
を呼び出します。 いずれの場合も、(off_type)newpos == (off_type)(-1)
(位置指定操作が失敗) の場合、関数は istr.setstate(failbit)
を呼び出します。 どちらの関数も *this
を返します。
fail
が true
の場合、メンバー関数では何もしません。
詳細については、「rdbuf
」、「pubseekpos
」、「pubseekoff
」、および「setstate
」を参照してください。
例
// basic_istream_seekg.cpp
// compile with: /EHsc
#include <iostream>
#include <fstream>
int main ( )
{
using namespace std;
ifstream file;
char c, c1;
file.open( "basic_istream_seekg.txt" );
file.seekg(2); // seek to position 2
file >> c;
cout << c << endl;
}
basic_istream::sentry
この入れ子になったクラスは、オブジェクトの宣言が書式設定された入力関数と書式設定されていない入力関数を構築するオブジェクトについて記述します。
class sentry {
public:
explicit sentry(
basic_istream<Char_T, Tr>& _Istr,
bool _Noskip = false);
operator bool() const;
};
解説
_Istr.good
が true
の場合、コンストラクターでは、
_Istr.tie
が null ポインターでない場合は、_Istr.tie->flush
を呼び出します。_Istr.flags & skipws
がゼロ以外の場合は、実質的にws(_Istr)
を呼び出します。
このような準備の後に _Istr.good
が false
の場合、コンストラクターでは _Istr.setstate(failbit)
を呼び出します。 いずれの場合も、コンストラクターは、_Istr.good
で返された値を status
に格納します。 後で operator bool
を呼び出すと、この格納された値が配信されます。
詳細については、good
、tie
、flush
、ws
、flags
、skipws
、setstate
を参照してください。
basic_istream::swap
2 つの basic_istream
オブジェクトの内容を交換します。
void swap(basic_istream& right);
パラメーター
right
basic_istream
オブジェクトへの lvalue
参照。
解説
メンバー関数は、basic_ios::swap(right)
を呼び出します。 また、抽出カウントを right
の抽出カウントと交換します。 詳細については、basic_ios::swap
を参照してください。
basic_istream::sync
ストリームに関連付けられた入力デバイスをストリームのバッファーと同期します。
int sync();
戻り値
rdbuf
が Null ポインターの場合、この関数は -1 を返します。 そうでない場合は、rdbuf->pubsync
を呼び出します。 この呼び出しで-1 が返された場合、関数は setstate(badbit)
を呼び出し、-1 を返します。 それ以外の場合、関数は 0 を返します。 詳細については、次のトピックを参照してください。 pubsync
および setstate
basic_istream::tellg
ストリーム内の現在の読み取り位置を報告します。
pos_type tellg();
戻り値
ストリームの現在の位置。
解説
fail
が false
の場合、メンバー関数では rdbuf->pubseekoff(0, cur, in)
を返します。 それ以外の場合は pos_type(-1)
を返します。 詳細については、次のトピックを参照してください。 rdbuf
および pubseekoff
例
// basic_istream_tellg.cpp
// compile with: /EHsc
#include <iostream>
#include <fstream>
int main()
{
using namespace std;
ifstream file;
char c;
streamoff i;
file.open("basic_istream_tellg.txt");
i = file.tellg();
file >> c;
cout << c << " " << i << endl;
i = file.tellg();
file >> c;
cout << c << " " << i << endl;
}
basic_istream::unget
最後に読み取った文字をストリームに戻します。
basic_istream<Char_T, Tr>& unget();
戻り値
ストリーム (*this
)。
解説
書式設定されていない入力関数では、可能であれば、rdbuf->sungetc
を呼び出した場合と同じように、前の要素をストリームに戻します。rdbuf
が null ポインターの場合、または sungetc
の呼び出しで traits_type::eof
が返される場合、関数では setstate(badbit)
を呼び出します。 いずれの場合も、*this
を返します。
詳細については、「sungetc
「eof
および「setstate
」を参照してください。 また、unget
がどのように失敗する可能性があるかについては、「basic_streambuf::sungetc
」を参照してください。
例
// basic_istream_unget.cpp
// compile with: /EHsc
#include <iostream>
using namespace std;
int main( )
{
char c[10], c2;
cout << "Type 'abc': ";
c2 = cin.get( );
cin.unget( );
cin.getline( &c[0], 9 );
cout << c << endl;
}
abc
Type 'abc': abc
abc