|
Программирование >> Инициализация объектов класса, структура
Прочитайте из стандартного ввода последовательность данных таких типов: string, double, string, int, string. Кажд1й раз проверяйте, не было ли ошибки чтения. Упражнение 20.3 Прочитайте из стандартного ввода заранее неизвестное число строк. Поместите их в список. Найдите самую длинную и самую короткую строку. 20.3. Дополнительные операторы ввода/вывода Иногда необходимо прочитать из входного потока последовательность не интерпретируемых байтов, а типов данных, таких, как char, int, string и т.д. Функция-член get() класса istream читает по одному байту, а функция getline() читает строку, завершающуюся либо символом перехода на новую строку, либо каким-то иным символом, определяемым пользователем. У функции-члена get() есть три формы: get(char& ch) читает из входного потока один символ (в том числе и пустой) и помещает его в ch. Она возвращает объект iostream, для которого была вызвана. Например, следующая программа собирает статистику о входном потоке, а затем #include <iostream> int main() { char ch; int tab cnt = 0, nl cnt = 0, space cnt period cnt = 0, coma cnt = 0; while ( cin.get(ch)) { switch( ch ) { case : space cnt++; case \t: tab cnt++; case \n: nl cnt++; cout break; break; break; case period cnt++; break; case coma cnt++; break; case ,: cout.put(ch \nнаша статистика:\n\t пробелов: << space cnt символов новой строки: << nl cnt табуляций: << tab cnt << \n\t точек: << period cnt << \t запятых: << comma cnt endl; копирует входной поток в выходной: Функция-член put() класса ostream дает альтернативный метод вывода символа в выходной поток: put() принимает аргумент типа char и возвращает объект класса ostream, для которого была вызвана. После компиляции и запуска программа печатает следующий результат: Alice Ea 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, there is no such creature, she tells him, at the same time wanting him to tell her more. Shyly, she asks, I mean, Daddy, is there? наша статистика: пробелов: 5 9 символов новой строки: 6 табуляций: 0 точек: 4 запятых: 12 вторая форма get() также читает из входного потока по одному символу, но возвращает не поток istream, а значение прочитанного символа. Тип возвращаемого значения равен int, а не char, поскольку необходимо возвращать еще и признак конца файла, который обычно равен -1, чтобы отличаться от кодов реальных символов. Для проверки на конец файла мы сравниваем полученное значение с константой EOF, определенной в заголовочном файле iostream. Переменная, в которой сохраняется значение, возвращенное get() , должна быть объявлена как int, #include <iostream> int main() int ch; альтернатива: while ( ch = cin.get() && ch != EOF ) while (( ch = cin.get()) != EOF ) cout.put( ch ); return 0; чтобы в ней можно было представить не только код любого символа, но и EOF: При использовании любой из этих форм get() для чтения данной последовательности нужно семь итераций: Читаются следующие символы: (a, пробел, b, пробел, c, символ новой строки, d). На восьмой итерации читается EOF. Оператор ввода (>>) но умолчанию пропускает пустые символы, поэтому на ту же последовательность потребуется чет1ре итерации, на которых возвращаются символы: a, b, c, d. А вот следующая форма get() может прочесть всю последовательность всего за две итерации; сигнатура третьей формы get() такова: get(char *sink, streamsize size, char delimiter=\n) sink - это массив, в который помещаются символы. size - это максимальное число символов, читаемых из потока istream. delimiter - это символ-ограничитель, при обнаружении которого чтение прекращается. Сам ограничитель не читается, а оставляется в потоке и будет прочитан следующим. Программисты часто забывают удалить его из потока перед вторым обращением к get() . Чтобы избежать этой #include <iostream> int main() const int max line = 1024; char line [ max line ]; while ( cin.get( line, max line )) { читается не больше max line - 1 символов, чтобы оставить место для нуля int get count = cin.gcount(); символов: cout << фактически прочитано << get count << endl; что-то сделать со строкой если встретился символ новой строки, удать его, прежде чем приступать к чтению следящей if ( get count < max line-1 ) cin.ignore(); пример ее применения: Если на вход этой программы подать текст о юной Алисе Эмме, то результат будет выглядеть так: фактически прочитано символов: 52 фактически прочитано символов: 60 фактически прочитано символов: 66 фактически прочитано символов: 63 фактически прочитано символов : 61 фактически прочитано символов: 43 Чтобы еще раз протестировать поведение программ:, mi создали строку, содержащую больше max line символов, и поместили ее в начало текста. Получили: i фактически прочитано символов: 1023 ошибки, в показанной ниже программе мы воспользовались функцией-членом ignore() класса istream. По умолчанию ограничителем является символ новой строки. Символы читаются из потока, пока одно из следующих условий не окажется истинным. Как только это случится, в очередную позицию массива помещается двоичный нуль. прочитано size-1 символов; встретился конец файла; встретился символ-ограничитель (еще раз напомним, что он остается в потоке и будет считан следующим). Эта форма get() возвращает объект istream, для которого была вызвана (функция-член gcount() позволяет узнать количество прочитанных символов). Вот простой
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0.123
При копировании материалов приветствуются ссылки. |