|
Программирование >> Операторы преобразования типа
Конструктор потокового итератора ввода открывает поток данных и обычно читает первый элемент, поскольку в противном случае он не смог бы вернуть Разделитель относится к тину const char*, поэтому при передаче объекта типа string необходимо преобразовать его к правильному типу вызовом функции c str() (см. с. 495). Пример: string dellm; ostrea[n iterator<int>Ccout.delini.c str()): Потоковые итераторы ввода Потоковые итераторы ввода являются противоположностью потоковых итераторов вывода. Потоковый итератор ввода читает элементы из входного потока данных. Это позволяет алгоритмам читать свои исходные данные прямо из потока. Тем пе менее потоковые итераторы ввода устроены несколько сложнее потоковых итераторов вывода (как обычно, чтение является более сложной операцией, чем запись). В момент создания потоковый итератор ввода инициализируется входным потоком данных, из которого будут читаться данные. Далее стандартный интерфейс итераторов ввода (см. с. 258) используется для чтения элементов оператором >>. Тем не менее чтение может завершиться неудачей (при достижении копид файла или возникновении ошибки), а интервальному источнику алгоритма необходима конечная позиция . Обе проблемы решаются при помощи итератора конца потока данных., создаваемого консфуктором по умолчанию 1ютоковых итераторов ввода. Если попытка чтения завершается неудачей, все потоковые итераторы ввода превращаются в итераторы конца потока данных. Следовательно, после каждой операции чтения потоковый итератор ввода необходимо сравнивать с итератором конца потока данных и убеждаться в том, что он остался действительным. В табл. 7.10 перечислены все операции потоковых итераторов ввода. Таблица 7.10. Операции потоковых итераторов ввода первый элемент при вызове оператора * после инициализации. Тем не менее реализация может отложить первое чтение до первого вызова оператора *. Это означает, что потоковый итератор ввода не следует определять задолго до того, когда он действительно понадобится. Потоковые итераторы вывода определяются для типа элемента Т: namespace std ( template <class Т. class charT char. class traits = char tra1ts<char T>. class Distance = ptrdiff t > class istream iterator; Необязательные второй и третий аргументы шаблона определяют тип используемого потока данных (их смысл разъясняется на с. 562). Необязательный четвертый аргумент шаблона определяет тип разности итераторов. Два потоковых итератора ввода равны, если выполняется одно из следующих условий: О оба являются итераторами конца потока данных, то есть дальнейшее чтение невозможно; О оба итератора могут читать из одного потока данных. Следующий пример демонстрирует использование потокового итератора ввода. iter/istriter.cpp #include <iostream> #include <iterator> using namespace std: int mainO ( Создание потокового итератора ввода для чтения целых чисел из cin istream iterator<int> intReader(cin): II Создание итератора конца потока данных vi stream i terator<i nt> i ntReaderEOF; -/* Пока удается читать лексемы потоковым итератором ввода. * - дважды вывести прочитанное значение */ while CintReader != IntReaderEOF) { cout once: *intReader endl: cout once again: *intReader endl; ++intReader; В устаревших системах, не поддсржииающих значения но умолчанию для параметров шаблонов, четвертый аргумент является обязательным (и перелается на месте второго аргумента), а аргументы типа потока данных отсутствуют. Пусть входными данными программы является следующая последовательность: 1 2 3 f 4 Если запустить программу с этими входными данными, результат ее выполнения будет выглядеть так: опое: 1 once again: 1 once: 2 once again: 2 once: 3 once again: 3 Как видите, символ h во входном потоке данных завершает работу программы. Из-за ошибки формата дальнейшее чтение невозможно, поэтому потоковый итератор ввода intReader равен итератору конца потока данных intReaderEOF (а условие завершения цикла становится равным false). Еще один пример использования потоковых итераторов в следующем примере задействованы обе разновидности потоковых итераторов, а также функция advance(): iter/advance2.cpp #1nclude <1ostrearfi> #include <str1ng> #1nclude <a1gorithm> using namespace std; int mainO { 1strearfi iterator<string> cinPos(cin); ostream iterator<str1ng> coutPosCcout. ): /* Пока при вводе не Судет достигнут конец файла * - записывать каждую третью строку while CdnPos != istream iterator<string>()) { Пропустить следующие две строки advance CcinPos. 2); Чтение и запись третьей строки if CcinPos != istream iterator<string>()) { *coutPos++ = *cinPos++; cout endl: Вспомогательная функция advance() перемещает итератор к другой позиции (см. с. 265). При использовании с потоковыми итераторами вывода она позво-
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |