Чтение онлайн

на главную

Жанры

Освой самостоятельно С++ за 21 день.

Либерти Джесс

Шрифт:

В строке 14 пользователю вновь предлагается ввести строку, которая теперь уже считывается оператором ввода. В нашем примере вводится строка four five six, после чего первое слово four присваивается переменной stringTwo. После отображения предложения Enter string three: снова вызывается функция getline. Так как часть строки five six все еще находится в буфере ввода, она сразу считывается до символа новой строки. Функция getline завершает свою работу, и строкой 20 выводится значение переменной stringThree.

В результате третья строка не вводится в программу, поскольку функция getline возвращает часть строки,

оставшуюся в буфере после операции ввода в строке 15, так как оператор >> считывает строку только до первого пробела и вставляет найденное слово в массив символов.

Как вы помните, можно использовать несколько вариантов перегруженной функ- ции-члена get. В первом варианте она не принимает никаких параметров и возвращает значение полученного символа. Во втором принимается ссылка на односимвольную переменную и возвращается объект istream. В третьей, последней версии в функцию get устанавливаются массив символов, количество считываемых символов и символ разделения (которым по умолчанию является разрыв строки). Эта версия функции get возвращает символы в массив либо до тех пор, пока не будет введено максимально возможное количество символов, либо до первого символа разрыва строки. Если функция get встречает символ разрыва строки, ввод прерывается, а символ разрыва строки остается в буфере ввода.

Функция-член getline также принимает три параметра: буфер ввода, число символов в строке с учетом концевого нулевого символа и символ разделения. Функция getline действует аналогично описанной выше функции get, но отличается от последней только тем, что не оставляет в буфере символ разрыва строки.

Использование функции cin.ignore 

 В некоторых случаях возникает необходимость пропустить часть символов строки от начала до достижения конца строки (EOL) или конца файла (EOF). Именно этому и отвечает функция ignore. Она принимает два параметра: число пропускаемых символов и символ разделения. Например, вызов функции ignore(80, '\n') приведет к пропуску 80 символов, если ранее не будет найден символ начала новой строки. Последний затем будет удален из буфера, после чего функция ignore завершит свою работу. Использование функции ignore показано в листинге 16.8.

Листинг 16.8. Использование функции ignore

1: // Листинг 16.8. Использование ignore

2: #include <iostream.h>

3:

4: int main

5: {

6: char string0ne[255];

7: char stringTwo[255];

8:

9: cout << "Enter string one:";

10: cin.get(stringOne,255);

11: cout << "String one: " << stringOne << endl;

12:

13: cout << "Enter string two: ";

14: cin.getline(stringTwo,255);

15: cout << "String two: " << stringTwo << endl;

16:

17: cout << "\n\nNow try again...\n";

18:

19: cin.ignore(255,'\n');

20: cout << "Enter string two: ";

21: cin.getline(stringTwo,255);

22:

23: cout << "String Two: " << stringTwo<< endl;

24:

25: cout << "Enter string one: ";

26: cin.get(stringOne,255);

27: cout << "String one: " << stringOne<< endl;

28: return 0;

29: }

Результат:

Enter string one: once upon

а time

String one: once upon а time

Enter string two:

String two:

Now try again...

Enter string one: once upon a time

String one: once upon a time

Enter string two: there was a

String Two: there was a

Анализ: В строках 6 и 7 создаются два массива символов. В строке 9 пользователю предлагается ввести строку. В нашем примере вводится строка once upon а time. Ввод завершается нажатием <Enter>. В строке 10 для считывания этой строки используется функция get, которая присваивает эту строку переменной stringOne и останавливается на символе начала новой строки, оставляя его в буфере ввода.

В строке 13 пользователю еще раз предлагается ввести вторую строку, однако в этот раз функция getline в строке 14 считывает символ разрыва строки, оставшийся в буфере, и сразу же завершает свою работу.

В строке 19 пользователю предлагается ввести первую строку. Однако в этом случае для пропуска символа разрыва строки используется функция ignore (см. в листинге 16.8 строку 23). Таким образом, при вызове getline строкой 26 буфер ввода пуст, и пользователь получает возможность ввести следующую строку.

Функции-члены peek и putback

Объект cin обладает двумя дополнительными методами, которые могут оказаться весьма полезными. Метод peekпросматривает, но не считывает очередной символ. Метод putback вставляет символ в поток ввода. Использование этих методов показано в листинге 16.9.

Листинг 16.9. Использование функций peek В putback

1: // Листинг 16.9. Использование peek и putback

2: #include <iostream.h>

3:

4: int main

5: {

6: char ch;

7: cout << "enter а phrase: ";

8: while ( cin.get(ch) )

9: {

10: if (ch == '!' )

11: cin.putback('$');

12: else

13: cout << ch;

14: while (cin.peek == '#')

15: cin.ignore(1,'#');

16: }

17: return 0;

18: }

Результат:

enter а phrase: Now!is#the!time#for!fun#!

Now$isthe$timefor$fun$

Анализ: В строке 6 объявляется символьная переменная ch, а в строке 7 пользователю предлагается ввести строку текста. Назначение этой программы состоит в том, чтобы заменить все встречающиеся во введенной строке восклицательные знаки (!) знаком доллара ($) и удалить все символы (#).

Цикл while в теле функции main программы прокручивается до тех пор, пока не будет возвращен символ конца файла (вводится комбинацией клавиш <Ctrl+C> в Windows или <Ctrl+Z> и <Ctrl+D> в MS DOS и UNIX соответственно). (Не забывайте, что функция cin.get возвращает 0 в конце файла.) Если текущий символ оказывается восклицательным знаком, он отбрасывается, а в поток ввода функцией putback возвращается символ $. Если же текущий символ не является восклицательным знаком, он выводится на экран. Если текущий символ оказывается #, то он пропускается функцией ignore.

Поделиться:
Популярные книги

Черный Маг Императора 13

Герда Александр
13. Черный маг императора
Фантастика:
попаданцы
аниме
сказочная фантастика
фэнтези
5.00
рейтинг книги
Черный Маг Императора 13

Последняя Арена 4

Греков Сергей
4. Последняя Арена
Фантастика:
рпг
постапокалипсис
5.00
рейтинг книги
Последняя Арена 4

Маяк надежды

Кас Маркус
5. Артефактор
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Маяк надежды

Великий перелом

Ланцов Михаил Алексеевич
2. Фрунзе
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Великий перелом

Сопротивляйся мне

Вечная Ольга
3. Порочная власть
Любовные романы:
современные любовные романы
эро литература
6.00
рейтинг книги
Сопротивляйся мне

Инквизитор Тьмы 2

Шмаков Алексей Семенович
2. Инквизитор Тьмы
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Инквизитор Тьмы 2

Мастер Разума V

Кронос Александр
5. Мастер Разума
Фантастика:
городское фэнтези
попаданцы
5.00
рейтинг книги
Мастер Разума V

Бандит 2

Щепетнов Евгений Владимирович
2. Петр Синельников
Фантастика:
боевая фантастика
5.73
рейтинг книги
Бандит 2

Истребители. Трилогия

Поселягин Владимир Геннадьевич
Фантастика:
альтернативная история
7.30
рейтинг книги
Истребители. Трилогия

Гардемарин Ее Величества. Инкарнация

Уленгов Юрий
1. Гардемарин ее величества
Фантастика:
городское фэнтези
попаданцы
альтернативная история
аниме
фантастика: прочее
5.00
рейтинг книги
Гардемарин Ее Величества. Инкарнация

Падение Твердыни

Распопов Дмитрий Викторович
6. Венецианский купец
Фантастика:
попаданцы
альтернативная история
5.33
рейтинг книги
Падение Твердыни

"Дальние горизонты. Дух". Компиляция. Книги 1-25

Усманов Хайдарали
Собрание сочинений
Фантастика:
фэнтези
боевая фантастика
попаданцы
5.00
рейтинг книги
Дальние горизонты. Дух. Компиляция. Книги 1-25

Ох уж этот Мин Джин Хо 2

Кронос Александр
2. Мин Джин Хо
Фантастика:
попаданцы
5.00
рейтинг книги
Ох уж этот Мин Джин Хо 2

Энфис 6

Кронос Александр
6. Эрра
Фантастика:
героическая фантастика
рпг
аниме
5.00
рейтинг книги
Энфис 6