Робота з файлами у С++
Робота з файлами у С++ 1) Як у класичному С. 2) З використанням класів та об’єктів для роботи з потоками.
Потоки для роботи з файлами Крім стандартних потоків введення-виведення (cin, cout, cerr, clog) можна задати свої потоки і зв'язати їх з будь яким файлом. Працювати з потоками(файлами) можна як в послідовному доступі (текстові файли, читання/запис по черзі) так і в прямому доступі (двійкові файли, читання/запис з будь якого місця ). Все що раніше ми розглядали для потокового введення/виведення з клавіатури/монітору справедливо і для потокового введення/виведення з будь якого файлу.
Потоки для роботи з файлами Три класи для роботи з файлами: ifstream — клас вхідних файлових потоків; ofstream — клас вихідних файлових потоків; fstream — клас двонаправлених файлових потоків. Ці класи є похідними від класів istream, ostream і iostream відповідно, тому вони наслідують перезавантажені операції << і >>, прапорці форматування, маніпулятори, методи, стани потоків і т. д.
Потоки для роботи з файлами Використання файлів у програмі передбачає наступні дії: - створення потоку; - відкривання потоку і зв’язування його з файлом; - обмін даними(введення/виведення); - знищення потоку; - закривання файлу. Кожний клас файлових потоків містить конструктори, за допомогою яких можна створити об’єкти цих класів різними способами.
Створення файлових потоків #include <fstream> using namespace std; Конструктори без параметрів створюють об’єкт відповідного класу але не зв’язують його з файлом: ifstream <ім'я потоку>; ofstream <ім'я потоку>; Конструктори з параметрами створюють об’єкт відповідного класу, відкривають файл у відповідному режимі з вказаним ім’ям і зв’язують файл з об’єктом: ifstream <ім'я потоку>(<ім'я файлу>, <режим>= ios: : in); ofstream <ім'я потоку>(<ім'я файлу>, <режим>= ios: : out | ios: : trunc); fstream <ім'я потоку>(<ім'я файлу>, <режим>= ios: : in |ios: : out);
Створення файлових потоків Приклад: #include <fstream> using namespace std; …. . string filename(“d: //123. dat"); …. . ifstream in_stream; ofstream out_stream("1. txt"); fstream inout(filename. c_str(), ios: : out); in_stream, out_stream, inout - об'єкти-потоки файлового введення виведення класу fstream.
Режим відкривання файлів in - відкрити для читання out - відкрити для запису ate - встановити вказівник на кінець файлу app - відкрити для додавання в кінець trunc - якщо файл існує, видалити його nocreate - якщо файл не існує, видати помилку noreplace - якщо файл існує, видати помилку binary - відкрити у двійковому режимі
Режим відкривання файлів Комбінація прапорців ios binary + + + in + + + out + + + trunc + + Еквівалент у С app + + stdio "w" "a" "w" "r+" "wb" '"ab" "wb" "r+b" "w+b"
Відкривання файлів • Відкривати файл у програмі можна з використанням конструкторів, або методу open, що має такі ж параметри, як і відповідний конструктор. Приклад: // Використання конструктора ifstream inpf ("input. txt", ios: : in | ios: : nocreate); if (!inpf) { cout << "Неможливо відкрити файл для читання"; return 1; } ofstream f; f. open("output. txt"); // Використання методу open if (!f) { cout << " Неможливо відкрити файл для запису"; return 1; }
Відкривання файлів • Можна перевіряти успішність відкривання одночасно з відкриванням: Приклад: // Використання методу open ofstream f; if (! f. open("d: //1 kurs//output. txt", ios: : binary)) { cout << "Неможливо відкрити файл для запису"; return 1; }
Читання та запис файлів Виконується або за допомогою операцій читання і отримання, що аналогічні класам-потокам, або за допомогою методів класів. Для закривання потоку є метод close(), але оскільки він неявно виконується деструктором, явний виклик необхідний тільки тоді, коли треба закрити потік раніше кінця його області видимості.
Читання та запис файлів Приклад: (використання методів, програма виводить на екран вміст файлу): #include <fstream. h> int main() { char text[81], buf[81]; cout << "Введіть ім’я файлу: "; cin >> text; ifstream f(text, ios: : in|ios: : nocreate); if (!f) { cout << "Помилка відкривання файлу"; return 1; } while (!f. eof()) { f. getline(buf, 81); cout << buf << endl; } return 0; }
Введення та виведення потоків В потокових класах разом з операціями отримання >> і включення << визначені методи для неформатованого читання і запису в потік (при цьому перетворення даних не виконується). Методи читання з класу istream: gcount() — повертає кількість символів, що прочитані за допомогою останнього методу неформатованого введення; get() — повертає код отриманого із потоку символу чи EOF; get(c) — повертає посилання на потік, з якого виконувалось читання, і записує отриманий символ у с; get(buf, num , lim='n') — зчитує num-1 символів (або доки не зустрінеться символ lim) і копіює їх у символьний рядок buf. Замість символу lim у рядок записується признак кінця рядку ('