Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
+ООП_Навч_посібник.doc
Скачиваний:
7
Добавлен:
01.07.2025
Размер:
6.58 Mб
Скачать

19.6.2. Приклади використання довільного доступу до вмісту файлу

У наведеному нижче коді програми продемонстровано механізм використання функції seekp(). Вона дає змогу задати ім'я файлу у командному рядку, а за ним – конкретний байт, який потрібно у ньому змінити. Програма потім записує у вказану позицію символ "X". Звернемо Вашу увагу на те, що оброблюваний файл повинен бути відкритим для виконання операцій зчитування-запису.

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

#include <iostream> // Для потокового введення-виведення

#include <fstream> // Для роботи з файлами

#include <cstdlib> // Для використання бібліотечних функцій

using namespace std; // Використання стандартного простору імен

int main(int argc, char *argv[])

{

if(argc !=3) {

cout << "Застосування: ім'я_програми "

<< "<ім'я_файлу> <байт>\n";

return 1;

}

fstream out(argv[1], ios::in | ios::out | ios::binary);

if(!out) {

cout << "Не вдається відкрити файл.\n";

return 1;

}

out.seekp(atoi(argv[2]), ios::beg);

out.put('X');

out.close();

getch(); return 0;

}

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

Код програми 19.20. Демонстрація відображення вмісту файлу із заданої позиції

#include <iostream> // Для потокового введення-виведення

#include <fstream> // Для роботи з файлами

#include <cstdlib> // Для використання бібліотечних функцій

using namespace std; // Використання стандартного простору імен

int main(int argc, char *argv[])

{

char ch;

if(argc !=3) {

cout << "Застосування: ім'я_програми "

<< "<ім'я_файлу> <стapтова_позиція>\n";

return 1;

}

ifstream in(argv[1], ios::in | ios::binary);

if(!in) {

cout << "Не вдається відкрити файл.\n";

return 1;

}

in.seekg(atoi(argv[2]), ios::beg);

while(in.get(ch)) cout << ch;

getch(); return 0;

}

19.7. Використання перевантажених операторів введення-виведення даних під час роботи з файлами

Вище у цьому розділі Ви дізналися, як перевантажувати оператори введення-виведення для власних класів, а також як створювати власні маніпулятори. У наведених вище прикладах програм виконувалися тільки операції консольного введення-виведення. Але, оскільки всі С++-потоки однакові, то одну і ту саму операторну функцію виведення даних, наприклад, можна використовувати для виведення інформації як на екран, так і у файл, не вносячи при цьому ніяких істотних змін. Саме у цьому і полягають основні переваги С++-системи введення-виведення.

У наведеному нижче коді програми використовується перевантажений (для класу kooClass оператор виведення даних для запису значень координат у файл threed.

Код програми 19.21. Демонстрація механізму використання перевантаженого оператора введення-виведення даних для запису об'єктів класу kooClass у файл

#include <iostream> // Для потокового введення-виведення

#include <fstream> // Для роботи з файлами

using namespace std; // Використання стандартного простору імен

class kooClass { // Оголошення класового типу

int x, y, z; // Тривимірні координати; вони тепер закриті

public:

kooClass(int a, int b, int c) { x = а; y = b; z = c;}

friend ostream &operator<<(ostream &stream, kooClass obj);

};

// Відображення тривимірних координат x, y, z

// Перевантажений оператор виведення даних для класу kooClass

ostream &operator<<(ostream &stream, kooClass obj)

{

stream << obj.x << ", ";

stream << obj.y << ", ";

stream << obj.z << "\n";

return stream; // Повертає посилання на параметр stream

}

int main()

{

kooClass A_ob(1, 2, 3), B_ob(3, 4, 5), C_ob(5, 6, 7);

ofstream out("threed");

if(!out) {

cout << "Не вдається відкрити файл.";

return 1;

}

// Перевантажений оператор виведення даних

out << A_ob << B_ob << C_ob;

out.close();

getch(); return 0;

}

Якщо порівняти цю версію операторної функції виведення даних для класу kooClass з тією, що була представлена на початку цього розділу, то можна переконатися у тому, що для "налаштування" її на роботу з дисковими файлами ніяких змін вносити не довелося. Якщо оператори введення-виведення визначені коректно, то вони успішно працюватимуть з будь-яким потоком.

Варто знати! Перш ніж переходити до наступного розділу, не пошкодуйте часу і попрацюйте з С++-функціями введення-виведення. Створіть власний клас, а потім визначте для нього оператори введення-виведення. А ще створіть власні маніпулятори.

Розділ 20. Динамічна ідентифікація типів і оператори приведення типу

У цьому розділі розглядаються два засоби мови програмування C++, які підтримують сучасне ООП: динамічна ідентифікація типів (run-time type identification – RTTI) і набір додаткових операторів приведення типу. Жоден з цих засобів не був частиною оригінальної специфікації мови програмування C++, але обидва вони були додані з метою посилення підтримки поліморфізму часу виконання. Під RTTI розуміють можливість проведення ідентифікації типу об'єкта у процесі виконання програми. Оператори приведення типу, що розглядаються у цьому розділі, пропонують програмісту безпечніші способи виконання цієї операції. Як буде показано далі, один з них dynamic_cast, безпосередньо пов'язаний з RTTI-іденти­фі­ка­цією, тому оператори приведення типу і RTTI є сенс розглядати в одному розділі.