Каждая из двух данных последовательностей считается составленной из пяти строк, разделенных пробелами, если для чтения используются операторы ввода с типами const char* или string:
A fine and private place
"A fine and private place"
Наличие кавычек не делает пробелы внутри закавыченной строки ее частью. Просто открывающая кавычка становится начальным символом первого слова, а закрывающая – конечным символом последнего.
Вместо того чтобы читать из стандартного ввода по одному символу, можно воспользоваться потоковым итератором istream_iterator:
#include algorithm
#include string
#include vector
#include iostream
int main()
{
istream_iterator string in( cin ), eos ;
vector string text ;
// копировать прочитанные из стандартного ввода значения
// в вектор text
copy( in , eos , back_inserter( text ) ) ;
sort( text.begin() , text.end() ) ;
// удалить дубликаты
vector string ::iterator it;
it = unique( text.begin() , text.end() ) ;
text.erase( it , text.end() ) ;
// вывести получившийся вектор
int line_cnt = 1 ;
for ( vector string ::iterator iter = text.begin() ;
iter != text.end() ; ++iter , ++line_cnt )
cout *iter
( line_cnt % 9 ? " " : " \n" ) ;
cout endl;
}
Пусть входом для этой программы будет файл istream_iter.C с исходным текстом. В системе UNIX мы можем перенаправить стандартный ввод на файл следующим образом (istream_iter – имя исполняемого файла программы):
istream_iter istream_iter.C
(Для других систем необходимо изучить документацию.) В результате программа выводит:
!= " " " \n" #include % ( ) *iter ++iter
++line_cnt , 1 9 : ; algorithm iostream.h
string vector = ::difference_type ::iterator ? allocator
back_inserter(
cin copy( cout diff_type eos for in in( int
istream_iterator it iter line_cnt main() sort( string test test.begin()
test.end() test.erase( typedef unique( vector { }
(Потоковые итераторы ввода/вывода iostream рассматривались в разделе 12.4.)
Помимо предопределенных операторов ввода, можно определить и собственные перегруженные экземпляры для считывания в пользовательские типы данных. (Подробнее мы расскажем об этом в разделе 20.5.)
20.2.1. Строковый ввод
Считывание можно производить как в C-строки, так и в объекты класса string. Мы рекомендуем пользоваться последними. Их главное преимущество – автоматическое управление памятью для хранения символов. Чтобы прочитать данные в C-строку, т.е. массив символов, необходимо сначала задать его размер, достаточный для хранения строки. Обычно мы читаем символы в буфер, затем выделяем из хипа ровно столько памяти, сколько нужно для хранения прочитанной строки, и копируем данные из буфера в эту память:
#include iostream
#include string.h
char inBuf[ 1024 ];
try
{
while ( cin inBuf ) {
char *str = new char[ strlen( inBuf ) + 1 ];
strcpy( str, inBuf );
// ... сделать что-то с массивом символов str
delete [] str;
}
}
catch( ... ) { delete [] str; throw; }
Работать с типом string значительно проще:
#include iostream
#include string.h
string str;
while ( cin str )
// ... сделать что-то со строкой
Рассмотрим операторы ввода в C-строки и в объекты класса string. В качестве входного текста по-прежнему будет использоваться рассказ об Алисе Эмме:
Alice Emma has long flowing red hair. Her Daddy says
when the wind blows through her hair, it looks almost
alive, like a fiery bird in flight. A beautiful fiery
bird, he tells her, magical but untamed. " Daddy, shush,