12.4.5. Итератор ostream_iterator

12.4.5. Итератор ostream_iterator

Объявление потокового итератора записи ostream_iterator может быть представлено в двух формах:

Если бы компилятор полностью удовлетворял стандарту C++, достаточно было бы написать так:

istream_iterator input_set1( infile1 ), eos;

istream_iterator input_set2( infile2 );

ostream_iterator identifier( ostream& )

ostream_iterator identifier( ostream&, char * delimiter )

где Type – это любой встроенный или пользовательский тип класса, для которого определен оператор вывода (operator). Во второй форме delimiter – это разделитель, то есть C-строка символов, которая выводится в файл после каждого элемента. Такая строка должна заканчиваться двоичным нулем, иначе поведение программы не определено (скорее всего, она аварийно завершит выполнение). В качестве аргумента ostream может выступать объект класса ostream, например cout, либо

#include iterator

#include fstream

#include string

#include complex

// записать последовательность объектов типа complex

// в стандартный вывод, разделяя элементы пробелами

ostream_iterator complex os_complex( cin, " " );

// записать последовательность строк в именованный файл

ofstream outfile( "dictionary" );

производного от него класса с открытым типом наследования, скажем ofstream:

ostream_iterator string os_string( outfile, " " );

Вот простой пример чтения из стандартного ввода и копирования на стандартный вывод с помощью безымянных потоковых итераторов и обобщенного алгоритма copy():

#include iterator

#include algorithm

#include iostream

int main()

{

copy( istream_iterator int ( cin ),

istream_iterator int (),

ostream_iterator int ( cout, " " ));}

Ниже приведена небольшая программа, которая открывает указанный пользователем файл и копирует его на стандартный вывод, применяя для этого алгоритм copy() и потоковый итератор записи ostream_iterator:

#include string

#include algorithm

#include fstream

#include iterator

main()

{

string file_name;

cout "please enter a file to open: ";

cin file_name;

if ( file_name.empty() || !cin ) {

cerr "unable to read file name "; return -1;

}

ifstream infile( file_name.c_str());

if ( !infile ) {

cerr"unable to open " file_name endl;

return -2;

}

istream_iterator string ins( infile ), eos;

ostream_iterator string outs( cout, " " );

copy( ins, eos, outs );

}