Файлові потоки
Під файлом зазвичай розуміють поіменовану інформацію на зовнішньому носієві, наприклад жорсткому магнітному диску. Логічно файл можна подати як кількість послідовних байтів, тому такі пристрої як дисплей, клавіатуру і принтер також можна розглядати як окремі випадки файлів.
За способом доступу файли можна поділи: на послідовні (текстові), читання і запис в яких проводяться з початку байт за байтом, і файли з довільним доступом (бінарні) , які допускають читання і запис у вказану позицію.
Стандартна бібліотека містить три класи для роботи з файлами:
ifstream — клас вхідних файлових потоків;
ofstrearn — клас вихідних файлових потоків;
fstream — клас двонаправлених файлових потоків.
Ці класи є похідними від класів istream, ostream та iostream відповідно, тому вони містять перевантажені операції << і >>, прапорці форматування, маніпулятори, методи, стани потоків і т. д.
Використання файлів в програмі передбачає наступні операції:
створення потоку;
відкриття потоку і пов’язування його з файлом;
обмін (ввід/вивід);
знищення потоку;
закриття файлу.
Кожен клас файлових потоків містить конструктори, за допомогою яких можна створювати об'єкти цих класів різними способами.
Конструктори без параметрів створюють об'єкт відповідного класу, не пов'язуючи його з файлом:
ifstream (); { input }
ofstream (); { output }
fstream ();, { file- потік}
Конструктори з параметрами створюють об'єкт відповідного класу, відкривають файл з вказаним ім'ям і пов'язують файл з об'єктом:
іfstream(const char *name, int mode = ios::in);
ofstream(const char *name, int mode = ios::out | ios::trunc);
Другим параметром конструктора є режим відкриття файлу. Якщо встановлене за замовчанням значення не влаштовує програміста, можна вказати інше, склавши його з бітових масок, визначених в класі ios:
enum open_mode {
in = 0x01, //Відкрити для читання
out = 0x02, // Відкрити для запису
ate = 0x04, // Встановити покажчик на кінець файлу
арр = 0x08, // Відкрити для додавання в кінець
trunc = 0x10, // Якщо файл існує, вилучити його
nocreate = 0x20, // Якщо файл не існує, видати помилку
noreplace = 0x40, // Якщо файл існує, видати помилку
binary= 0x80. // Відкрити у двійковому режимі
};
Відкрити файл в програмі можна з використанням або конструкторів, або методу open, що має такі ж параметри, як і у відповідному конструкторі, наприклад
// Використання конструктора
ifstream inpf ("input.txt"); if (!inpf){
cout << "Неможливо відкрити файл для читання"; return 1;}
ostream f;
f.open("output.txt". ios :: out); // Використання методу open
if (!f) {
out << "Неможливо відкрити файл для запису"; return 1 ;}
Читання і запис виконуються або за допомогою операцій читання і вилучення, аналогічних потоковим класам, або за допомогою методів класів.
Приклад використання методів (програма виводить на екран вміст файлу):
#include <fstream.h>
int main () {
char text[81], buf[81];
cout << "Введите имя файла:";
сіn >> text;
ifstream f(text);
if ( !f) {
cout << "Помилка відкриття файлу"; return 1;}
while ( !f.eof() ) {
f.getline(buf, 81);
cout << buf << endl; }
return 0; }
Для закриття потоку визначений метод close(), але оскільки він неявно виконується деструктором, явний виклик необхідний тоді, коли потрібно закрити потік раніше кінця його області видимості.