- •Буферизація
- •Потоки і буфери
- •Стандартні об'єкти введення-виводу
- •Лістинг 3. Введення рядка значень
- •Результат:
- •Введення рядків із стандартного пристрою введення
- •Результат:
- •Використання функції cout.Width()
- •Результат:
- •Лістинг 15. Вывод данных с помощью фцнкции printf()
- •Результат:
- •Лістинг 16. Відкриття файлу для читання і запису
- •Результат:
- •Налаштування відкриття файлу об'єктом ofstream
- •Лістинг 17. Додавання даних в кінець файлу
- •Результат:
- •Двійкові і текстові файли
- •Лістинг 18. Запис класу у файл
- •Результат:
- •Установка параметрів введення-виводу за допомогою коммандной рядка
- •Лістинг 20. Використання аргументів командного рядка
- •Результат:
- •Питання і відповіді
Лістинг 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() з символьним параметром, якщо потрібно послідовно вводити всі символи рядка, включаючи пропуски.