Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
О.О.П / ооп / 4_кол / Лекції / ООП (16. Робота з потоками).doc
Скачиваний:
23
Добавлен:
30.05.2020
Размер:
240.13 Кб
Скачать

Лістинг 3. Введення рядка значень

1: //Лістинг 3. Введення рядка значень з допомогою cin

2:

3: #include <iostream.h>

4:

5: int main()

6: {

7:    int myInt;

8:    long myLong;

9:    double myDouble;

10:   float myFloat;

11:   unsigned int myUnsigned;

12:   char myWord[50];

13:

14:   cout << "int: ";

15:   cin >> myInt;

16:   cout << "Long: ";

17:   cin >> myLong;

18:   cout << "Double: ";

19:   cin >> myDouble;

20:   cout << "Float: ";

21:   cin >> myFloat;

22:   cout << "Word: ";

23:   cin >> myWord;

24:   cout << "Unsigned: ";

25:   cin >> myUnsigned;

26:

27:   cout << "\n\nInt:\t" << myInt << endl;

28:   cout << "Long:\t" << myLong << endl;

29:   cout << "Double:\t" << myDouble << endl;

30:   cout << "Float:\t" << myFloat << endl;

31:   cout << "Word: \t" << myWord << endl;

32:   cout << "Unsigned:\t" << myUnsigned << endl;

33:

34:   cout << "\n\nInt, Long, Double, Float, Word, Unsigned: ";

35:   cin >> myInt >> myLong >> myDouble;

36:   cin >> myFloat >> myWord >> myUnsigned;

37:   cout << "\n\nInt:\t" << myInt << endl;

38:   cout << "Long:\t" << myLong << endl;

39:   cout << "Double:\t" << myDouble << endl;

40:   cout << "Float:\t" << myFloat << endl;

41:   cout << "Word: \t" << myWord << endl;

42:   cout << "Unsigned:\t" << myUnsigned << endl;

43:

44:

45:   return 0;

46: }

Результат:

Int: 2

Long: 30303

Double: 393939397834

Float: 3.33

Word: Hello

Unsigned: 85

Int: 2

Long: 30303

Double: 3.93939e+11

Float: 3.33

Word: Hello

Unsigned: 85

Int, Long. Double, Float, Word, Unsigned: 3 304938 393847473 6.66 bye -2

Int: 3

Long: 304938

Double: 3.93847e+08

Float: 6.66

Word: bye

Unsigned: 4294967294

Знов в програмі оголошуються змінні різних типів і масив символів. Користувачеві пропонується послідовно ввести дані різних типів, аби переконатися що програма підтримує введення даних будь-якого типа.

Аналіз: У рядку 34 користувачеві пропонується ввести всі дані відразу в певному порядку, після чого кожне введене значення привласнюється відповідній змінній. Завдяки тому що cin розглядає пропуски між словами як роздільники, стає можливою ініціалізація всіх змінних. Інакше програма намагалася б ввести весь рядок в одну змінну, що було б помилкою.

Звернете увагу на рядок 42, в якій виводиться без знакове ціле число. Користувач ввів значення -2. Оскільки програма була проінструктована, що вводиться без знакове ціле число, то замість знакового -2 буде введено без знакове двійкове представлення цього числа. Тому при виводі за допомогою cout на екрані відображується значення 4294967294, що є двійковим представленням числа -2.

Пізніше ви взнаєте, як вводити в буфер рядки, декілька слів, що містять, розділених пропусками. Зараз же розглянемо детальніше використання cin для введення даних відразу в декілька змінних, як в рядках 35-36.

Оператор >> повертає заслання на об'єкт istream

Оператор >> повертає заслання на об'єкт istream. Але оскільки cin сам є об'єктом istream, результат виконання однієї операції введення може бути початком наступної операції введення, як показано нижче:

Int Var0ne, varTwo, varThree;

cout << "Enter three numbers: "

cin >> Var0ne >> varTwo >> varThree;

У рядку cin >> VarOne >> varTwo >> varThree; спочатку виконується перше введення cin >> VarOne, внаслідок чого повертається об'єкт istream, що дозволяє виконати привласнення другого значення змінній varTwo. Це рівносильно наступному запису:

((cin >> VarOne) >> varTwo) >> varThree;

Аналогічний підхід використовується з об'єктом cout.

Інші методи об'єкту cin

На додаток до перенавантажуваного оператора >> об'єкт cin має безліч інших вбудованих методів. Вони використовуються в тих випадках, коли необхідний досконаліший контроль над введенням даних.

Введення одного символу

Варіант operator>>, що приймає заслання на символ, може використовуватися для прочитування одного символу із стандартного пристрою введення. Для цього використовується функція-член get(). При цьому можна застосовувати get() без параметрів або використовувати варіант цієї ж функції, що приймає як параметр заслання на символ.

Використання функції gef() без параметрів

Спочатку розглянемо використання функції get() без параметрів. В цьому випадку функція повертає значення знайденого символу або EOF (end of file — кінець файлу) досягши кінця файлу. Функція get () без параметрів використовується рідко. Так, cin.get() не можна використовувати для послідовної ініціалізації ряду змінних, оскільки повертане функцією значення не є об'єктом iostream. Саме тому наступний запис працювати не буде:

cin.get() >>myVarOne >> myVarTwo // помилка

Запис cin.get() >> myVarOne повертає значення типа int, а не об'єкт iostream. Приклад використання функції get() без параметрів показаний в листинге.4.

Лістинг 4. Використання функції get() Без параметрів

1: // Листинг 16.4. Використання get() без параметрів

2: #include <iostream.h>

3:

4: int main()

5: {

6:    char ch;

7:    while ( (ch = cin.get()) != EOF)

8:    {

9:       cout << "ch: " << ch << endl;

10:   }

11:   cout << "\nDone!\n";

12:   return 0;

13: }

Примітка: Для виходу з цієї програми доведеться ввести символ кінця файлу з клавіатури.

Результат:

Hello

ch H

ch e

ch 1

ch 1

ch о

ch 

World

ch W

ch о

ch r

ch 1

ch d

ch 

(ctrl-z)

Done!

Аналіз: У рядку 6 оголошується локальна символьна змінна. У циклі while символ, отриманий від cin.get(), привласнюється ch, і якщо повернений символ не EOF, то він виводиться на друк. Цикл завершується введенням EOF, комбінацією клавіш <Ctrl+Z> в DOS або <Ctrl+D> в UNIX.

Слід зазначити, що не у всіх версіях бібліотеки istream підтримується функція-член get(), хоча зараз вона є частиною стандарту ANSI/ISO.

Використання функції get() з параметром

При установці у функції get() параметра, вказуючого на символьну змінну, цією змінною привласнюється черговий символ потоку введення. При цьому повертається об'єкт iostream, що дозволяє вводити послідовний ряд значень, як показано в лістингу 5.

Лістинг 5. Використання функції get() з параметрами

1: // Лістинг 5. Використання get() з параметрами

2: #include <iostream.h>

3:

4: int main()

5: {

6:    char а, b, с;

7:

8:    cout << "Enter three letters: ";

9:

10:   cin.get(a).get(b).get(c);

11:

12:   cout << "а: " << а << "\nb: " << b << "\nc: " << с << endl;

13:   return 0;

14: }

Результат:

Enter three letters: one

а: о

b: n

с: e

Аналіз: У рядку 6 оголошуються символьні змінні а, b і с. У рядку 10 тричі послідовно викликається функція cin.get(). Спочатку викликається cin.get(a), в результаті перший символ буфера введення заноситься в а і повертається об'єкт cin, після чого відбувається виклик cin.get(b), привласнюючий черговий символ буфера змінної b. Аналогічним чином викликається функція cin.get(c), що привласнює наступний символ змінної с.

Оскільки cin.get() повертає cin, можна було записати це таким чином:

cin.get(a) >> b;

В цьому випадку cin.get(a) поверне cin, тому наступне вираження матиме вигляд: cin >> b;.

Рекомендується: Використовуйте оператора введення >>, коли необхідно вводити значення, розділені пропусками в рядку. Використовуйте функцію get() з символьним параметром, якщо потрібно послідовно вводити всі символи рядка, включаючи пропуски.