Файловая система 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(), открытие файла для записb в него
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();
  }
}

 


Связанные темы