Программирование >>  Дополнительные возможности наследования 

1 ... 164 165 166 [ 167 ] 168 169 170 ... 265


12 13 14 15 16 17 18 19 20 21 22

cout Enter string one: ;

cin.getline(stringOne,256);

cout << stringOne: << stringOne << endl;

cout << Enter string two: ; cin stringTwo;

cout << stringTwo; stringTwo endl;

cout Enter string three; ; cin.getline(stringThree,256); cout << stringlhree: << stringThree endl; return 0;

Enter string one: one two three

StringOne: one two three

Enter string two: four five six

StringTwo: four

Enter string three: stringThree: five six

Этот пример требует детального исследования, поскольку возможны некоторые сюрпризы.

В строках 6-8 объявляются массивы символов. В строке 10 пользователю предлагается ввести строку текста, которая считывается функцией getline(). Аналогично функции get(), параметры getlineO устанавливают буфер ввода и максимальное число символов. Однако, в отличие от get(), функция getlineO считывает и удаляет из буфера символ разрыва строки. Как вы помните, функция get() воспринимает символ разрыва строк как разделитель и оставляет его в буфере ввода.

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

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

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



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

ИсноАьзованив функции с1нлупогв

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

Авсшииг 1B.S. Исионьзовавие фуитвв ignoreO

2 3 4 5 6 7 8 9

10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29

Листинг 16.8. Использование ignoreO flinclude <iostreani.h>

int mainO {

char string0ne[255]; char stringTwo[255];

cout Enter string one: ; cin.get(stringOne,255);

cout String one: stringOne endl;

cout << Enter string two: ;

cin,getline(stringTwo,255);

cout << String two: stringTwo endl;

cout Л n\ nNow try again...\ n ;

cout Enter string one: ; cin.get(stringOne,255);

cout String one: stringOne endl;

cin. ignore(255, Д nO:

cout << Enter string two: ; cin.getline(stringTwo,255); cout String Two: stringTwo endl; return 0;

Enter string one: once upon a time

String one: once upon a 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 пользователю предлагается ввести строку. В нашем примере вводится строка опое upon а time. Ввод завершается нажатием <Enter>. В строке 10 для считывания этой строки используется функция get(), которая присваивает эту строку переменной stringOne и останавливается на символе начала новой строки, оставляя его в буфере ввода.

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

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

Шункцнп-ЧАВНЫ ревк(1 п pntbackd

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

Авсшвнг 1В.9. йсноАьзованвв фувкциб реек() в putbackO

2 3 4 5 6 7 8 9

10 11 12 13 14 15 16 17 18

Листинг 16,9. Использование реекО и putbackO flinclude <iostream.h>

int mainO {

char ch;

cout << enter a phrase: ; while ( cin.get(ch) ) {

If (ch == ! 0

cin.putbackC$); else

cout ch; while (cin.peekO == #0

cin. ignored, #):

return 0;

,. enter a phrase: Now! isflthe! timeflfor! fun#! Now$isthe$timefor$fun$



1 ... 164 165 166 [ 167 ] 168 169 170 ... 265

© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика