|
Программирование >> Инициализация объектов класса, структура
фактически прочитано символов: 52 фактически прочитано символов: 52 фактически прочитано символов : 60 фактически прочитано символов : 66 фактически прочитано символов: 63 фактически прочитано символов : 61 фактически прочитано символов: 43 По умолчанию ignore() читает и удаляет один символ из потока, для которого вызвана, но можно и явно задать ограничитель и количество пропускаемых символов. В общем виде ее сигнатура такова: ignore( streamsize length = 1, int delim = traits::eof ) ignore() читает и отбрасывает length символов из потока или все символы до ограничителя включительно или до конца файла и возвращает объект istreami, для которого вызвана. Mi рекомендуем пользоваться функцией getline(), а не get(), поскольку она автоматически удаляет ограничитель из потока. Сигнатура getline() такая же, как у get() с тремя аргументами (и возвращает она тоже объект istream, для которого вызвана): getline(char *sink, streamsize size, char delimiter=\n) Поскольку и getline() , и get() с тремя аргументами могут читать size символов или меньше, то часто нужно спросить у объекта istream, сколько символов было фактически прочитано. Это позволяет сделать функция-член gcount (): она возвращает число символов, прочитанных при последнем обращении к get() или getline() . Функция-член write() класса ostream дает альтернативный метод вывода массива символов. Вместо того чтобы выводить символы до завершающего нуля, она выводит указанное число символов, включая и внутренние нули, если таковые имеются. Вот ее сигнатура: write( const char *sink, streamsize length ) Здесь length определяет, сколько символов выводить. write() возвращает объект класса ostream, для которого она вызвана. Парной для функции write() из класса ostream является функция read() из класса istream с такой сигнатурой: read( char* addr, streamsize size ) read() читает size соседних байт из входного потока и помещает их, начиная с адреса addr. Функция gcount() возвращает число байт, прочитанных при последнем обращении к read() . В свою очередь read() возвращает объект класса istream, для которого она вызвана. Вот пример использования getline() , gcount() и write() : #include <iostream> int main() { const int lineSize = 1024; int lcnt = 0; сколько строк прочитано int max = -1; дина самой длинной строки char inBuf[ lineSize ]; читается до конца строки, но не более 1024 символов while (cin.getline( inBuf, lineSize )) сколько символов фактически прочитано int readin = cin.gcount(); статистика: счетчик строк, самая длинная строка ++lcnt; if ( readin > max ) max = readin; cout << Строка # << lcnt << \tПрочитано символов: << readin << endl; cout.write( inBuf, readin).put(\n).put(\n); cout << Всего прочитано строк: << lcnt << endl; cout << Самая длинная строка: << max << endl; Когда на вход было подано несколько фраз из романа Германа Мелвилла Моби Дик , программа напечатала следующее: Строка #1 Прочитано символов: 45 Call me Ishmael. Some years ago, never mind Строка #2 Прочитано символов: 46 how long precisely, having little or no money Строка #3 Прочитано символов: 4 8 in my purse, and nothing particular to interest Строка #4 Прочитано символов: 51 me on shore, I thought I would sail about a little Строка #5 Прочитано символов: 4 7 and see the watery part of the world. It is a Строка #6 Прочитано символов: 43 way I have of driving off the spleen, and Строка #7 Прочитано символов: 28 regulating the circulation. Всего прочитано строк: 7 Самая длинная строка: 51 Функция-член getline() класса istream поддерживает только ввод в массив символов. Однако в стандартной библиотеке есть обычная функция getline() , которая помещает символы в объект класса string: возвращает символ в поток putback( char class ); устанавливает указатель на следящий символ потока istream на один символ назад unget(); возвращает следующий символ (и EOF), но не извлекает его из потока Вот еще три необходимые нам функции-члена класса istream: peek(); char ch, next, lookahead; while ( cin.get( ch )) switch (ch) { case /: это комментарий? посмотрим с помощью peek() если да, пропустить остаток строки next = cin.peek(); if ( next == / ) cin.ignore( lineSize, \n ); break; case >: проверка на лексему >>= next = cin.peek(); if ( next == > ) { lookahead = cin.get(); next = cin.peek(); if ( next != = ) cin.putback( lookahead ); ... Следующий фрагмент иллюстрирует использование некоторых из них: Упражнение 20.4 Прочитайте из стандартного ввода следующую последовательность символов, включая все пустые, и скопируйте каждый символ на стандартный вывод (эхо-копирование): getline( istream &is, string str, char delimiter ); Эта функция читает не более str::miax size()-1 символов. Если входная последовательность длиннее, то операция завершается неудачно и объект переводится в ошибочное состояние. В противном случае ввод прекращается, когда прочитан ограничитель (он удаляется из потока, но в строку не помещается) либо достигнут конец файла.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |