Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Шпора II Sem.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
679.94 Кб
Скачать

9.5.4. Зчитування та записування у файл блоків даних

Для зчитування і записування у файл блоків двійкових даних використовуються функції-члени read() і write(). Їх прототипи мають такий вигляд:

istream &read(char *buf, streamsize num);

ostream &write(const char *buf, int streamsize num);

1. Функція read() зчитує num байт даних з пов'язаного з файлом потоку і поміщає їх у буфер, який адресується покажчиком buf.

2. Функція write() записує num байт даних у пов'язаний з файлом потік з буфера, який адресується покажчиком buf.

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

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

Демонстрація механізму використання функцій read() і write()

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

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

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

int main()

{

int n[5] = {1, 2, 3, 4, 5};

register int i;

ofstream out("test", ios::out | ios::binary);

if(!out) {

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

return 1;

}

out.write((char *) &n, sizeof n);

out.close();

for(i=0; i<5; i++) n[i] = 0; // Очищує масив

ifstream in("test", ios::in | ios::binary);

if(!in) {

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

return 1;

}

in.read((char *) &n, sizeof n);

for(i=0; i<5; i++) // Відображаємо значення, зчитані з файлу.

cout << n[i] << " ";

in.close();

getch(); return 0;

}

Зверніть увагу на те, що в настановах звернення до функцій read() і write() виконуються операції приведення типу, які є обов'язковими при використанні буфера, що визначається у вигляді не символьного масиву.

Функція gсоипt () повертає кількість символів, зчитаних у процесі вико­нання останньої операцгі введення даних.

Якщо кінець файлу досягнуто ще до того моменту, як було зчитано num символів, то функція read() просто припинить своє виконання, а буфер міститиме стільки символів, скільки вдалося зчитати до цього моменту. Точну кількість зчитаних символів можна дізнатися за допомогою ще однієї функції-члена класу gcount(), яка має такий прототип:

streamsize gcount();

Функція gcount() повертає кількість символів, зчитаних у процесі виконання останньої операції введення даних.

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

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]