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

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

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

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

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

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

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

int main()

{

ofstream out("test");

if(!out) {

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

return 1;

}

out << 10 << " " << 123.23 << endl;

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

out.close();

getch(); return 0;

}

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

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

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

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

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

int main()

{

char ch;

int c;

float f;

char str[80];

ifstream in("test");

if(!in) {

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

return 1;

}

in >> c;

in >> f;

in >> ch;

in >> str;

cout << c << " " << f << " " << ch << endl;

cout << str;

in.close();

getch(); return 0;

}

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

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

9.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().

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

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

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

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

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

{

char ch;

if(argc !=2) {

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

return 1;

}

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

if(!in) {

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

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().

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

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

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

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

int main()

{

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

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

if(!out) {

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

return 1;

}

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

out.close();

getch(); return 0;

}