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

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

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

<p>Использование функции cin.ignore </p></span><span>

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

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

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

2: #include

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. Ввод завершается нажатием . В строке 10 для считывания этой строки используется функция get, которая присваивает эту строку переменной stringOne и останавливается на символе начала новой строки, оставляя его в буфере ввода.

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

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

<p>Функции-члены peek и putback</p></span><span>

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

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

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

2: #include

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 пользователю предлагается ввести строку текста. Назначение этой программы состоит в том, чтобы заменить все встречающиеся во введенной строке восклицательные знаки (!) знаком доллара ($) и удалить все символы (#).

Перейти на страницу:

Похожие книги

Сущность технологии СОМ. Библиотека программиста
Сущность технологии СОМ. Библиотека программиста

В этой книге СОМ исследуется с точки зрения разработчика C++. Написанная ведущим специалистом по модели компонентных объектов СОМ, она раскрывает сущность СОМ, помогая разработчикам правильно понять не только методы модели программирования СОМ, но и ее основу. Понимание мотивов создания СОМ и ее аспектов, касающихся распределенных систем, чрезвычайно важно для тех разработчиков, которые желают пойти дальше простейших приложений СОМ и стать по-настоящему эффективными СОМ-программистами. Показывая, почему СОМ для распределенных систем (Distributed СОМ) работает именно так, а не иначе, Дон Бокс дает вам возможность применять эту модель творчески и эффективно для ежедневных задач программирования.

Дональд Бокс

Программирование, программы, базы данных / Программирование / Книги по IT