Шаг 385.
Библиотека STL.
Строки. Примеры использования итераторов со строками (окончание)

    На этом шаге мы рассмотрим пример, реализующий чтение из стандартного входного потока с использованием итераторов.

    В следующем примере содержимое строки читается из стандартного входного потока данных с использованием конечных итераторов вставки:

//---------------------------------------------------------------------------

#include <vcl.h>
#include <string>
#include <iostream>
#include <algorithm>
#include <iterator>
#include <locale>

#include <conio.h>   //необходимо для getch()

#pragma hdrstop

//---------------------------------------------------------------------------

#pragma argsused
using namespace std;

std::string ToRus(const std::string &in)
{
  char *buff = new char [in.length()+1];
  CharToOem(in.c_str(),buff);
  std::string out(buff);
  delete [] buff;
  return out;
}

class bothWhiteSpaces {
  private:
    const locale& loc;    // Локальный контекст
  public:
    // Конструктор
    // - сохранение объекта локального контекста
    bothWhiteSpaces (const locale& l) : loc(l) {
    }
    // Функция проверяет, являются ли оба символа пропусками
    bool operator() (char elem1, char elem2) {
        return isspace(elem1,loc) && isspace(elem2,loc);
    }
};


int main (int argc, char* argv[])
{

  string contents;

  // Не игнорировать начальные пропуски
  cin.unsetf (ios::skipws);

  // Чтение всех символов со сжатием пропусков
  unique_copy(istream_iterator<char>(cin),    // Начало источника
              istream_iterator<char>(),       // Конец источника
              back_inserter(contents),        // Приемник
              bothWhiteSpaces(cin.getloc())); // Критерий удаления

  // Обработка содержимого
  // - в данном случае - запись в стандартный вывод
  cout << contents;


  getch();
  return 0;
}

//---------------------------------------------------------------------------
Текст этого примера можно взять здесь.

    Результат выполнения программы выглядит так:


Рис.1. Результат работы приложения

    Алгоритм unique_copy() (смотри 294 шаг) читает все символы из входного потока данных cin и вставляет их в строку contents. Объект функции bothWhiteSpaces проверяет, являются ли два последовательных символа пропусками. Для этого он инициализируется локальным контекстом cin и вызывает функцию isspace(), которая проверяет, относится ли символ к категории пропусков (функция isspace() будет рассмотрена позднее). Алгоритм unique_copy() использует критерий bothWhiteSpaces для удаления смежных пропусков. Похожий пример приведен при описании алгоритма unique_copy() на 294 шаге.

    На следующем шаге мы рассмотрим интернационализацию.




Предыдущий шаг Содержание Следующий шаг