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

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

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

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

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

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

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

int main()

{

ofstream out("test");

if(!out) {

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

return 1;

}

out << 10 << " " << 123.23 << "\n";

out << "Це короткий текстовий файл.";

out.close();

getch(); return 0;

}

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

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

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

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

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

int main()

{

char ch;

int izm;

float f;

char strMas[80];

ifstream in("test");

if(!in) {

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

return 1;

}

in >> izm;

in >> f;

in >> ch;

in >> strMas;

cout << izm << " " << f << " " << ch << "\n";

cout << strMas;

in.close();

getch(); return 0;

}

Варто знати! Під час використання перевантаженого оператора ">>" для зчитування даних з текстових файлів відбувається перетворення деяких символів. Наприклад, "пропускні" символи опускаються. Якщо необхідно запобігти будь-яким перетворенням символів, то потрібно відкрити файл у двійковому режимі доступу до його даних.

Необхідно пам'ятати! Під час використання перевантаженого оператора ">>" для зчитування рядка введення даних припиняється внаслідок виявлення першого "пропускного" символу.

19.5.3. Неформатоване введення-виведення даних у двійковому режимі

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

Для виконання двійкових операцій файлового введення-виведення необхідно відкрити файл з використанням специфікатора режиму ios::binary. Необхідно відзначити, що функції, які використовуються для оброблення неформатованих файлів, можуть також виконувати дії з файлами, відкритими в текстовому режимі доступу, але при цьому використовується перетворення символів, яке зводить нанівець основну мету виконання двійкових файлових операцій.

Функція get() зчитує символ з файлу, а функція put() записує символ у файл.

У загальному випадку існує два способи запису неформатованих двійкових даних у файл і зчитування їх з файлу. Перший спосіб полягає у використанні функції-члена класу put() (для запису байта у файл) і функції-члена класу get() (для зчитування байта з файлу). Другий спосіб передбачає застосування "блокових" С++-функцій введення-виведення read() і write(). Розглянемо кожен спосіб окремо.

Функції get() і put() мають багато форматів, але найчастіше використовуються такі їх версії:

istream &get(char &ch);

ostream &put(char ch);

1. Функція get() зчитує один символ з відповідного потоку і поміщає його значення у змінну ch. Вона повертає посилання на потік, що є пов'язаним із заздалегідь відкритим файлом. Досягнувши кінця цього файлу, значення посилання дорівнюватиме нулю.

2. Функція put() записує символ ch у потік і повертає посилання на цей потік.

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

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

#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) { // Досягши кінця файлу потоковий

// об'єкт in прийме значення false.

in.get(ch);

if(in) cout << ch;

}

in.close();

getch(); return 0;

}

Досягши кінця файлу, потоковий об'єкт in прийме значення ФАЛЬШ, яке зупинить виконання циклу while. Проте існує дещо коротший варіант коду програми організації циклу, призначеного для зчитування і відображення вмісту файлу:

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

Цей варіант організації циклу також має право на існування, оскільки функція get() повертає потоковий об'єкт in, який, досягши кінця файлу, прийме значення false.

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

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

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

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

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

int main()

{

char *p = "Всім привіт!";

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

if(!out) {

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

return 1;

}

while(*p) out.put(*p++);

out.close();

getch(); return 0;

}