- •Буферизація
- •Потоки і буфери
- •Стандартні об'єкти введення-виводу
- •Лістинг 3. Введення рядка значень
- •Результат:
- •Введення рядків із стандартного пристрою введення
- •Результат:
- •Використання функції cout.Width()
- •Результат:
- •Лістинг 15. Вывод данных с помощью фцнкции printf()
- •Результат:
- •Лістинг 16. Відкриття файлу для читання і запису
- •Результат:
- •Налаштування відкриття файлу об'єктом ofstream
- •Лістинг 17. Додавання даних в кінець файлу
- •Результат:
- •Двійкові і текстові файли
- •Лістинг 18. Запис класу у файл
- •Результат:
- •Установка параметрів введення-виводу за допомогою коммандной рядка
- •Лістинг 20. Використання аргументів командного рядка
- •Результат:
- •Питання і відповіді
Питання і відповіді
-
Як визначити, коли використовувати операторів введення і виводу, а коли інші функції-члени класів потоку?
В цілому оператори введення і виводу простіше у використанні, тому в більшості випадків краще звертатися саме до них. У деяких інших випадках, коли ці оператори не справляються зі своєю роботою (наприклад, при введенні рядка із слів, розділених пропусками), можна вдатися до використання інших функцій.
-
Яка відмінність між cerr і clog?
Об'єкт cerr не буферизируется? Іншими словами, всі дані, що поступають в cerr, негайно виводяться на екран. Це відмінно личить для виведення помилок на екран, проте дорого обійдеться при записі реєстраційної інформації на диск. Об'єкт clog буферизирует свій вивід, тому в останньому випадку може бути ефективнішим.
-
Навіщо створювати потоки, якщо відмінно працює функція printf()? Функція printf() не контролює строго типів даних, що виводяться, чого вимагають стандарти C++. Крім того, ця функція не поддреживает роботу з класами.
-
Коли слід застосовувати метод putback()?
Цей метод вельми ефективний в тих випадках, коли для визначення відповідності введеного символу встановленим обмеженням використовується одна операція прочитування, а для запису символу в буфер використовуються деякі інші операцій. Найчастіше це знаходить вживання при аналізі синтаксичних конструкцій файлу, наприклад при створенні компіляторів.
-
Коли слід використовувати функцію ignore()?
Найчастіше вона використовується після функції get(). Оскільки остання залишає в буфері символ розриву рядка, інколи за викликом функції get() слідує виклик ignore(1, '\n');. Ця функція, як і putback(), використовується, як правило, при синтаксичному розборі файлів.
-
Мої друзі використовують в своїх програмах на C++ функцію printf(). Чи можна і мені її використовувати?
Звичайно ж, можна. Проте, хоча ця функція простіша у використанні, ви втратите строгий контроль за типами файлів і утрудните роботу з об'єктами класів.
Контрольні питання
1. Що таке оператор введення і як він працює?
2. Що таке оператор виводу і як він працює?
3. Перерахуєте три варіанти переобтяженої функції cin.get() і вкажіть основні їх відмінності.
4. Чим cin.read() відрізняється від cin.getline()?
5. Яка ширина встановлюється за умовчанням для виведення довгих цілих чисел за допомогою оператора виводу?
6. Яке значення повертає оператора виводу?
7. Який параметр приймається конструктором об'єкту ofstream?
8. Що встановлює аргумент ios::ate?
Вправи
1. Напишіть програму, що використовує чотири стандартні об'єкти класу iostream, — cin, cout, cerr і clog.
2. Напишіть програму, що пропонує користувачеві ввести своє повне ім'я з подальшим виведенням цього імені на екран.
3. Перепишіть лістинг 16.9, відмовившись від використання методів putback() і ignore().
4. Напишіть програму, що прочитує ім'я файлу як аргумент командного рядка і відкриває файл для читання. Розробіть алгоритм аналізу всіх символів, що зберігаються у файлі, і виведіть на екран лише текстові символи і розділові знаки (пропускайте всі недруковані символи). Закрийте файл перед завершенням роботи програми.
5. Напишіть програму, яка виведе задані аргументи командного рядка в зворотному порядку, відкинувши ім'я програми.