Файлова система C++. Загальні принципи роботи. Приклади. Відкриття/закриття файлу

Файлова система C++. Загальні принципи роботи. Приклади. Відкриття/закриття файлу


Зміст


1. Підключення доступу до класів роботи з файловою системою C++

Файлове введення/виведення є частиною загальної системи введення/виведення мови C++. Для того, щоб у програмі можна було використовувати файлове введення/виведення попередньо має бути підключений модуль fstream

#include <fstream>

У цьому модулі реалізовані основні класи для роботи з файловою системою:

  • ifstream – використовується для організації введення з файлового потоку;
  • ofstream – використовується для організації виведення у файл (файловий потік);
  • fstream – використовується для забезпечення введення/виведення.

 

2. Створення файлового потоку. Яким чином здійснюється зв’язок потоку з файлом? Функція open()

Щоб створити файловий потік потрібно оголосити екземпляр одного з класів ifstream, ofstream або fstream

// оголошення екземплярів класів для різних видів потоків
ifstream is; // потік введення
ofstream os; // потік виведення
fstream fs; // потік введення/виведення

Створений потік зв’язується з файлом з допомогою функції open(), яка має різні реалізації у різних класах.

У класі ifstream функція open() має таку реалізацію

ifstream::open(const char* filename, ios::openmode mode = ios::in);

тут

  • filename – ім’я файлу, який відкривається. Ім’я може бути повним або скороченим, наприклад, “myfile.txt”;
  • mode – спосіб відкриття файлу. Цей параметр приймає значення ios::in, яке описується у функції openmode(). Значення ios::in означає, що файл відкривається тільки для введення.

У класі ofstream функція open() має наступний прототип

ifstream::open(const char* filename, ios::openmode mode = ios::out | ios::trunc);

тут

  • filename – ім’я файлу, який виводиться;
  • mode – параметр, що задає спосіб відкриття файлу. У цьому параметрі значення ios::out означає, що файл відкривається для виведення. Значення ios::trunc означає, що попередній вміст існуючого файлу з таким самим іменем буде видалений, а довжина файлу стане рівною нуль.

У класі fstream прототип функції open() наступний

ifstream::open(const char* filename, ios::openmode mode = ios::in | ios::out);

тут

  • filename – ім’я файлу;
  • mode – параметр, що задає спосіб відкриття файлу. Як видно зі значення параметру mode, файл відкривається і для запису і для читання.

 

3. Способи відкриття файлу. Функція openmode()

Способи відкриття файлу можуть бути різними. Значення, що описують способи відкриття файлу, реалізовані в функції openmode(). Нижче наведено значення, які можуть повертатись функцією openmode() та пояснення до них:

  • ios::app – дані, що записуються, дописуються в кінець файлу;
  • ios::ate – при відкритті файлу відбувається пошуку кінця файлу. Але запис у файл може здійснюватись в будь-яке місце цього файлу;
  • ios::binary – дозволяє відкрити файл у бінарному (двійковому) режимі. Існує два режими відкриття файлу: текстовий та бінарний. За замовчуванням файли відкриваються у текстовому режимі;
  • ios::in – файл відкривається для введення (відбувається читання з файлу);
  • ios::out – файл відкривається для виведення (відбувається запис у файл);
  • ios::trunc – означає, що попередній вміст існуючого файлу з таким самим іменем буде видалений, а довжина файлу стане рівною нуль. Якщо відкрити потік виведення з допомогою класу ofstream увесь вміст файлу з таким самим іменем стирається.

Способи відкриття файлу можна комбінувати між собою з допомогою операції | (побітове АБО).

Приклад. Способи відкриття файлу.

// комбінування значень, що визначають спосіб відкриття файлу
// 1. Відкриття файлу для виведення (запис у файл)
ofstream outFile;
outFile.open("myfile.txt", ios::out);

// 2. Відкриття файлу для виведення - спрощений варіант (запис у файл)
outFile.open("myfile.txt");

// 3. Відкриття файлу для введення (читання з файлу)
ifstream inFile;
inFile.open("myfile.txt", ios::in);

// 4. Відкриття файлу для введення - спрощений варіант (читання з файлу)
inFile.open("myfile.txt");

 

4. Функція is_open(). Перевірка відкриття файлу. Приклад

Функція is_open() призначена для перевірки, чи закрито файл чи ні. Ця функція реалізована у класах ifstream, ofstream та fstream.

Функція має наступний прототип:

bool is_open();

Функція повертає true, якщо потік зв’язаний з відкритим файлом. В іншому випадку функція повертає false.



Приклад. Демонструється визначення відкриття файлу для об’єкту os класу ofstream. Якщо файл відкрито, то цей файл закривається.

ofstream os; // оголосити об’єкт класу ofstream
string filename = "myfile.txt";

// спроба відкриття файлу
os.open(filename);

if (!os.is_open())
{
  // файл не відкрито
  cout << "Файл не відкрито." << endl;
}
else
{
  // Вивести повідомлення
  cout << "Файл відкрито. Робота з файлом." << endl;
  cout << "Закриття файлу. " << endl;

  // закрити файл
  os.close();
}

 

5. Функція close(). Закриття файлу. Приклад

Щоб закрити файл, потрібно викликати функцію close().

Наприклад. Нижче продемонстровано відкриття та закриття файлу для потоку ifstream

ifstream is; // оголосити екземпляр класу ifstream
is.open("myfile.txt"); // відкрити файл для читання
is.close(); // закрити файл

 

6. Приклади відкриття/закриття файлу функцією open(). Перевірка відкриття файлу функцією is_open()

Відкрити файл можна одним з двох способів:

  • з допомогою функції open();
  • з допомогою конструктора класу (див. приклади нижче).

Якщо файл відкрито, то можна реалізовувати роботу з цим файлом. Можлива ситуація, що файл не буде відкритий після виклику функції f_open(). У цьому випадку у програмі потрібно реалізувати відповідну перевірку.

Коректність відкриття файлу можна реалізувати одним з двох способів, які наведено нижче

  • з допомогою відповідної перевірки оператором умовного переходу if;
  • з допомогою функції is_open().

Приклад 1. Відкриття файлу для виведення (запису).

#include <iostream>
#include <fstream>
using namespace std;

// Відкрити, закрити файл - клас ofstream
void OpenCloseFileOutput()
{
  ofstream outFile;
  outFile.open("myfile3.txt", ios::out);

  if (outFile)
  {
    // Робота з файлом
    // ...

    outFile.close();
  }
}

Приклад 2. Відкриття файлу для введення (читання).

// Відкрити, закрити файл - клас ifstream
void OpenCloseFileInput()
{
  // автоматичне відкриття файлу з допомогою конструктора
  ifstream inFile("myfile6.txt",ios::in);
  
  if (inFile)
  {
    // Робота з файлом
    // ...
    inFile.close();
  }
}

Приклад 3. Відкриття файлу для виведення (запису). Використання функції is_open().

// функція is_open(), відкриття файлу для запису в нього
void DemoIsFileOpenOutput()
{
  ofstream os; // оголосити об’єкт класу ofstream
  string filename = "myfile6.txt";

  // спроба відкриття файлу
  os.open(filename);

  if (!os.is_open())
  {
    // файл не відкрито
    cout << "File is not opened." << endl;
  }
  else
  {
    // Вивести повідомлення
    cout << "File is opened. Working with file." << endl;
    cout << "Close the file. " << endl;

    // Робота з файлом
    // ...

    // закрити файл
    os.close();
  }
}

Приклад 4. Відкриття файлу для введення (читання). Використання функції is_open().

// відкриття файлу для введення з нього
void DemoIsFileOpenInput()
{
  ifstream is; // оголосити об'єкт класу ifstream
  string filename = "myfile6.txt";

  // спроба відкриття файлу
  is.open(filename);

  if (!is.is_open())
  {
    cout << "File is not opened." << endl;
  }
  else
  {
    // вивести повідомлення
    cout << "File is opened. Working with file" << endl;
    cout << "Close the file." << endl;
    is.close();
  }
}

 


Зв’язані теми