С++ для начинающих


Итератор ostream_iterator


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

ostream_iterator<Type> identifier( ostream& )

ostream_iterator<Type> identifier( ostream&, char * delimiter )

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

#include <iterator>

#include <fstream>

#include <string>

#include <complex>

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

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

ostream_iterator< complex > os_complex( cin, " " );

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

ofstream outfile( "dictionary" );



ostream_iterator< string > os_string( outfile, "\n" );

Вот простой пример чтения из стандартного ввода и копирования на стандартный вывод с помощью безымянных потоковых итераторов и обобщенного алгоритма 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\n"; 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 );

}



Содержание раздела