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

Лістинг 15. Вывод данных с помощью фцнкции printf()

1: #include <stdio.h>

2: int main()

3: {

4:    printf("%s","hello world\n");

5:

6:    char *phrase = "Hello again!\n";

7:    printf("%s",phrase);

8:

9:    int x = 5;

10:   printf("%d\n",x);

11:

12:   char *phraseTwo = "Here's some values: ";

13:   char *phraseThree = " and also these: ";

14:   int у = 7, z = 35;

15:   long longVar = 98456;

16:   float floatVar = 8.8f;

17:

18:   printf("%s %d %d %s %ld %f\n",phraseTwo,y,z, phraseThree,longVar,floatVar);

19:

20:   char *phraseFour = "Formatted: ";

21:   printf("%s %5d %10d %10.5f\n",phraseFour,y,z,floatVar);

22:   return 0;

23: }

Результат:

hello world

Hello again!

5

Here's some values: 7 35 and also these: 98456 8.800000

Formatted: 7 35 8.800000

Аналіз: Перший раз функція printf() викликається в рядку 4 і має стандартну форму: за ім'ям функції printf слідує специфікатор перетворення (в даному випадку %s) і константний рядок в лапках, що виводиться на екран.

Специфікатор %s вказує, що в даний момент виводиться текстовий' рядок, вказаний далі, — "hello world".

Другий виклик функції printf в рядку 7 аналогічний першому, але в даному випадку замість константного рядка, ув'язненого в лапки, використовується покажчик типа char.

У третьому виклику printf() у рядку 10 використовується специфікатор виведення цілочисельного значення, що зберігається в змінній x. Ще складнішим виявляється четвертий варіант виклику функції printf(), показаний в рядку 18. Тут виводиться відразу шість значень. Кожному приведеному специфікатору відповідає своє значення, відокремлене від останніх за допомогою ком.

Нарешті, в рядку 21 у вже добре відомій вам функції printf() використовуються специфікатори форматування, визначальну довжину і точність значень, що виводяться. Багато хто вважає, що форматування виведення даних за допомогою специфікаторів функції printf() набагато простіше, ніж за допомогою маніпуляторів об'єкту cout.

Раніше вже наголошувалися основні недоліки функції printf() — відсутність строгого контролю за типами даних і неможливість оголошення цій функції як друга або методу класу. Тому при необхідності роздрукувати дані різних членів класу потрібно використовувати явно задані методи доступу до членів класу.

Узагальнення методів управління виведенням даних в програмах на C++

Для форматування виведення даних в C++ можна використовувати комбінації спеціальних символів, маніпуляторів і прапорів.

У виразах з об'єктом cout використовуються наступні спеціальні символи:

\n — новий рядок;

\r — повернення каретки;

\t — табуляція;

\\ — зворотний слеш;

\ddd (число у вісімковому коді) — символ ASCII;

\а — звуковий сигнал (дзвінок).

Приклад вираження виведення рядка:

cout << "\aAn error occured\t"

Вказане вираження не лише виводить повідомлення про помилку на екран комп'ютера. але подає застережливий звуковий сигнал і виконує перехід до наступної позиції табуляції. З оператором cout використовуються також маніпулятори. Проте для використання більшості маніпуляторів потрібно включити в програму файл iomanip.h. Далі вашій увазі представлений список маніпуляторів, що не вимагають включення iomanip.h:

flush — очищає буфер виводу;

endl — вставляє символ розриву рядка і очищає буфер виводу;

oct — встановлює вісімкова підстава для чисел, що виводяться;

dec — встановлює десяткова підстава для чисел, що виводяться;

hex — встановлює шістнадцятирична підстава для чисел, що виводяться.

А тепер приведемо набір маніпуляторів, для яких необхідне включення iomanip.h:

setbase (підстава) — встановлює підстава для чисел, що виводяться (0 = десяткова, 8 = вісімкова, 10 = десяткова, 16 = шістнадцятирична);

setw (ширина) — встановлює мінімальну ширину поля виводу;

setfill (символ) — встановлює символ заповнення незайнятих позицій поля виводу;

setprecision (точність) — встановлює число знаків після плаваючої коми; setiosflags (прапор) —устанавливает один або декілька прапорів;

resetiosflags (прапор) — скидає один або декілька прапорів.

Наприклад, в рядку

cout << setw(12) << setfill ("#') << hex << x <<endl;

встановлюється ширина поля в 12 знаків, символ заповнення #, вісімкова підстава чисел, що виводяться, після чого виводиться значення змінної x, додається символ розриву рядка і очищається буфер. Всі маніпулятори, за винятком flush, endl і setw, залишаються включеними впродовж всієї роботи програми, якщо, звичайно, не будуть зроблені інші установки. Установка маніпулятора setw відміняється відразу ж після поточного виводу з об'єктом cout.

З маніпуляторами setiosflags і resetiosflags можуть використовуватися наступні ювнфлаги:

iоs::left — вирівнює дані по лівому краю поля виводу;

ios::right — вирівнює дані по правому краю поля виводу;

ios::interval — вирівнює дані по ширині поля виводу;

ios::dec — виводить дані в десятковому форматі;

ios::oct — виводить дані у вісімковому форматі;

ios::hex — виводить дані в шістнадцятиричному форматі;

ios::showbase — додає префікс 0x до шістнадцятиричних значень і Про до вісімкових значень;

ios::showpoint — заповнює нулями бракуючі знаки в значеннях заданої довжини;

ios::uppercase — відображує у верхньому регістрі шістнадцятиричні і експоненціальні значення;

ios::showpos — додає знак '+' перед позитивними числами;

ios::scientific — відображує числа з плаваючою комою в експоненціальній виставі;

ios::fixed — відображує числа з плаваючою комою в шістнадцятиричній виставі.

Додаткову інформацію можна отримати з файлу ios.h або з довідкової системи компілятора.

Використання файлів для введення і виведення даних

Потоки C++ забезпечують універсальні методи обробки даних, що поступають з клавіатури або диска, а також що виводяться на екран і диск. В будь-якому разі можна використовувати або операторів введення і виводу, або інші стандартні функції і маніпулятори. Подальші розділи глави присвячені операціям відкриття і закриття файлів, які супроводяться створенням об'єктів ifstream і ofstream.

Об'єкти ofstream

Об'єкти, що створюються для прочитування або запису даних у файл, називаються ofstream. Вони є похідними від вже знайомого вам класу iostream.

Аби приступити до запису у файл, потрібно спочатку створити об'єкт ofstream, а потім пов'язати його з певним файлом на диску. Використання об'єктів ofstream вимагає включення в програму файлу заголовка fstream.h.

Примітка: Оскільки fstream містить в собі iostream.h, немає необхідності в окремому включенні файлу iostream.h.

Відкриття файлів для введення-виводу

Для відкриття файлу myfile.cpp за допомогою об'єкту ofstream потрібно оголосити екземпляр цього об'єкту, передавши йому як параметр ім'я файлу:

ofstream fout("myfile.cpp");

Відкриття файлу для введення виконується аналогічним чином, за тим виключенням, що для цього використовується об'єкт ifstream:

ifstream fin("myfile.cpp");

Звернете увагу, що у виразах задаються імена об'єктів fout і fin, які можна використовувати так само, як об'єкти cout і cin відповідно.

Дуже важливим методом, використовуваним у файлових потоках, є функція-член close(). Кожен створюваний об'єкт файлового потоку відкриває файл для читання або запису (або і для того і іншого відразу). Після закінчення роботи файл необхідно закрити за допомогою функції close(), аби згодом не пошкодити його і записані в нім дані.

Після пов'язання об'єктів потоку з відповідними файлами їх можна використовувати так само, як останні об'єкти введення-виводу. Приклад використання об'єктів для обміну даними з файлами показаний в лістингу 16.