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

19.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() виводить його.

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

Код програми 19.15. Демонстрація механізму використання функцій 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 << "Не вдається відкрити файл.\n";

return 1;

}

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

out.close();

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

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

if(!in) {

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

return 1;

}

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

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

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

in.close();

getch(); return 0;

}

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

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

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

streamsize gcount();

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

19.5.5. Виявлення кінця файлу

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

bool eof();

Ця функція повертає значення true у випадку досягнення кінця файлу; інакше вона повертає значення false.

Функція eof() дає змогу виявити кінець файлу.

У наведеному нижче коді програми для виведення на екран вмісту файлу використовується функція eof().

Код програми 19.16. Демонстрація виявлення кінця файлу за допомогою функції eof()

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

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

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

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

{

char ch;

if(argc != 2) {

cout << "Застосування: ім'я_програми <ім'я_файлу>\n";

return 1;

}

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

if(!in) {

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

return 1;

}

while(!in.eof()) { // Використання функції eof()

in.get(ch);

if(!in.eof()) cout << ch;

}

in.close();

getch(); return 0;

}