Під час розв’язання задач на комп’ютері часто виникає необхідність у використанні даних, які записані на зовнішніх носіях інформації (дисках) і оформлені у вигляді файлів даних. Незалежно від того, які дані містять файли (числа, символи, рядки, масиви, структури тощо), в мові С++ вони трактуються як потоки даних (stream),котрі являють собою послідовність байтів, що зчитуються або записуються.
За замовчуванням у кожній програмі С++ можна користуватися такими стандартними потоками: стандартного введення (сіn), стандартного виведення (cout) та виведення помилок (сеrr). Щоб користуватися файлами, потоки повинні бути створені і закріплені за цими файлами. Використання файлів даних у програмі передбачає виконання таких операцій:
- створення потоку обміну даними між файлом і пам’яттю комп’ютера;
- зв’язування цього потоку з конкретним ім’ям файла на диску і відкриття файла;
- запис даних у файл або читання їх з файла;
- закриття файла.
Для реалізації цих операцій існують спеціальні класи (див. розділ 11.1), які містять конструктори створення необхідних потоків:
- ifstream — для створення потоку читання даних;
- ofstream — для створення потоку запису даних у файл;
- fstream — використовується як для запису даних у файл, так і їх читання.
Конструктори — це спеціальні функції, які мають таке саме ім’я, що й ім’я класу. Вони записуються як з параметрами, так і без параметрів. Конструктори з параметрами одночасно створюють відповідний потік, зв’язують його з файлом на диску, відкривають файл для роботи і мають такі форми запису:
ofstream іп (“іф”, ios::out); або ofstream (“іф”);
ifstream іп (“іф”, ios::in); або ifstream (” “);
fstream іп (“іф”, ios::in | ios::out);
де іп — ім’я потоку, який створюється для роботи з файлом;іф — константа або змінна типу char[ ], її значення — ім’я файла на диску.
Перший з конструкторів використовується для запису даних у файл, другий — для читання даних з файла, а третій — як для запису, так і для читання даних, наприклад:
ofstream fout( “myfile.dat”, ios::out);
Цей запис створює потік з ім’ям fout, зв’язує його з файлом на диску, який має ім’яmyfile.dat і відкриває цей файл для запису даних. Файл myfile.dat буде створено у тому ж каталозі, що і програма. Якщо треба створити файл у другому місці, то для запису його імені треба вказати шлях, наприклад, a:\\pvp\\myfile.dat. Тепер цей файл буде записано на диску а: в каталозі pvp.
Зверніть увагу на те, що для запису шляху треба використовувати подвійні зворотні косі риски.
Можна також для роботи з файлами застосувати конструктори без параметрів:
ofstream іп;
ifstream іп;
fstream іп;
де іп — ім’я відповідного потоку, тоді для зв’язування потоку з ім’ям файла на диску і відкриття його для роботи треба додатково використовувати функцію-член відповідного класу, тобто:
іn.ореn(“іф”, ios :: режим | ios :: режим);
Наприклад, відкриття файла для запису до нього даних матиме вигляд:
ofstream fout;
fout.open ( “a:\\pvp\\my file.dat”, ios::out);
Конструктори як з параметрами, так і без них, виконують однакову роботу, тому яким з них надати перевагу — справа користувача.