
- •Лабораторна робота №11 (2 год.) Робота з файлами. Файлові потоки.
- •Теоретичні відомості
- •2. Потоки як узагальнені фільтри
- •Приклад 1. Простий приклад потокового вводу-виводу
- •3. Введення-виведення типів char I char*
- •4. Введення-виведення типів int I long
- •5. Введення-виведення типів float I double
- •6. Введення-виведення класів користувача
- •Приклад 3. Ввід-вивід класу користувача
- •7. Маніпулятори
- •8. Використання текстових файлів для введення
- •Приклад 4. Читання і перевірка файлу на помилки
- •9.Виведення текстових файлів
- •10. Читання бінарних файлів
- •Приклад 6. Читання текстового файлу в бінарному режимі
- •11. Запис у бінарні файли
- •12. Копіювання файлів
- •1. Потоки і потік введення - виведення
- •2. Текстові і двійкові потоки
- •3. Буферизація потоків
- •4. Стандартні потоки
- •5. Приклад програми роботи з файлами
- •6. Різниця при роботі з файлами у мовах Паскаль та с
- •Завдання
6. Введення-виведення класів користувача
Потоки елегантно працюють не лише з вбудованими типами даних С++, але і з класами користувача. Все, що потрібно зробити, так це перегрузити оператори вставки в потік і вилучення з потоку. Відповідний приклад 3 з використанням класу Point приведено нище.
Приклад 3. Ввід-вивід класу користувача
#include <iostream.h>
class Point {
float x, y, z;
public:
Point(float i, float j, float k) {x=i; y=j; z=k;}
friend ostream operator<<(ostream& os, Point& p);
friend istream operator>>(istream& is, Point& p);
};
ostream& operator<<(ostream& os, Point& p)
{
return os << ‘(’
<< p.x << ‘ ’
<< p.y << ‘ ’
<< p.z << ‘)’;
}
istream& operator>>(istream& is, Point& p)
{
return is >> p.x >> p.y >> p.z;
}
void main()
{
Point(2, 3, 5);
cout << “\n\nCoordinates of p are ” << p;
//отримання нових координат
cout << “\nNew coordinates ?”;
cin >> p;
//відображення нових координат
cout << “\nCoordinates of p are ” << p;
}
7. Маніпулятори
З появою бібліотеки вводу-виводу ANSI C форматування даних стало більш гнучким. За допомогою функцій printf(...) i sprintf(...) стали доступними як форматований вивід в файл, так і форматування даних в пам’яті. І навпаки, форматовані дані можна зчитати в змінні за допомогою функцій scanf(...) i sscanf(...).
Для роботи з будь-яким вбудованим маніпулятором використовується стандартний заголовочний файл iomanip.h. більшість маніпуляторів впливають на потік в наступних операціях з потоком. Це означає, що будь-які зміни в форматуванні потоку зберігаються до тих пір, поки не будуть внесені нові зміни. Нижче приведено список всіх вбудованих маніпуляторів.
dec Встановлює десяткову систему числення.
Впливає на int і long. Потоки використовують основу 10 за замовчуванням
hex Встановлює шістнадцяткову систему числення
oct Встановлює вісімкову систему числення
ws Вибирає з потоку вводу символи пропуску.
Потік буде читатися до появи символу, який
відрізняється від пропуску, або до виникнення
помилки потоку
endl Вставляє в потік виводу символ нової стрічки і
потім очищає потік
ends Вставляє ‘\0’ в потік виводу
flush Очищає потік виводу
setbase(int) Встановлює основу числення до будь-якого з
чотирьох значень:
0: Основа по замовчуванню. При виводі
використовується десяткова основа, при вводі –
числа, що починаються з ‘0’, вважаються
вісімковими, числа, що починаються з ‘0x’, –
шістнадцятковими. У всіх інших випадках
основа вважається десятковим.
8: Для вводу-виводу використовується
основа 8
10: Для вводу-виводу – 10
16: Для вводу-виводу – 16
Інші значення ігноруються. Бібліотека iostream
не підтримує довільних основ, подібних 3, 12 і
т.д. Якщо потрібно представити значення за
основою, яка відрізняється від 8, 10 або 16, то
відповідне перетворення потрібно виконати
явно
resetiosflags(long) Очищає один або більше флагів
форматування в ios::x_flags
setiosflags(long) Встановлює дин або більше флагів
форматування в ios::x_flags
setfill(int) Встановлює символ-зповнювач. Символ-
заповнювач використовується для заповнення
поля тоді, коли ширина поля більша за ширину
виведеного значення. Заповнення не буде, якщо
користувач не вказав мінімальної ширини поля
за допомогою маніпулятора setw(int) або
функції ios::width(int). По замовчуванню
символом-заповнювачем є пробіл. Заповнення
буде проходити справа, зліва або якось іще, в
залежності від значення бітів
ios::adjustfield, встановлених
звертанням до ios::setf(long)
setprecision(int) Встановлює число цифр після десяткової
крапки в числах з плаваючою крапкою. Цей
маніпулятор діє лише на потоки виводу
setw(int width) Встановлює ширину наступної змінної, яка
вставляється в потік. Якщо значення наступної
змінної потребує для запису менше місця, ніж
вказано, то буде здійснюватися заповнення
символом-заповнювачем, встановленим
маніпулятором setfill(int)