Краткие теоретические положения
Файловые операции ввода-вывода можно выполнять после включения в программу заголовка <fstream>, в котором определены все необходимые для этого классы и значения.
Открытие и закрытие файла
В С++ файл открывается путем связывания его с потоком. Существуют потоки трех видов: ввода, вывода и ввода-вывода. Чтобы открыть входной поток, необходимо объявить потоковый объект ifstream. Для открытия выходного потока нужно объявить поток типа ofstream. Поток, который предполагается использовать для операций ввода и вывода должен быть объявлен как объект класса fstream. Например:
ifstream in;
ofstream out;
fstream f;
Создав поток, нужно его связать с файлом. Это можно сделать с помощью функции open(). Ее используют следующим образом:
имя_потока. open (имя_файла, режим);
имя_файла может включать путь к файлу.
режим должен принимать одно или несколько значений перечисления openmode:
ios:app
ios:ate
ios:binary
ios:in
ios:out
ios:trunc
Назначение каждого из значений:
· app - присоединение к концу файла всех выводимых данных (только для файлов, открытых для вывода данных);
· ate – поиск будет начинаться с конца файла;
· binary - открытие файла в двоичном режиме; по умолчанию все файлы открываются в текстовом режиме. По умолчанию все файлы открываются в текстовом режиме. В текстовом режиме могут происходить некоторые преобразования символов (например, последовательность, состоящая из символов возврата каретки и перехода на новую строку, может быть преобразована в символ новой строки). При открытии файла в двоичном режиме никакого преобразования символов не происходит. Любой файл можно открыть как в текстовом, так и в двоичном режиме. Единственное различие между этими режимами состоит в преобразовании (или нет) символов.
· in - открытие файла для ввода данных (обычно это значение по умолчанию);
· out – открытие файла для вывода данных (обычно это значение по умолчанию);
· trunc – при открытии уже существующего файла его содержимое удаляется.
Пример создания и открытия обычного выходного файла:
ofstream out;
out.open(“test1.txt”);
Так как параметр mode функции open() по умолчанию устанавливается равным значению, соответствующему типу открываемого потока, в предыдущем примере нет необходимости задавать его значение.
Можно проверить успешность выполнения предыдущей операции по созданию и открытию файла следующим образом:
if(!out)
{cout<< “НЕ удается открыть файл.\n”;
//return 1;
}
Прежде чем выполнять какие-либо дальнейшие операции с файлом, всегда следует проверять результат выполнения функции open().
Можно также проверить файкт успешного открытия файла с помощью функции is_open():
if(!out.is_open())
{cout<< “файл не открыт!\n”;
//return 1;
}
Производить операцию открытия файла можно также так:
ofstream out1("test1.txt");
ofstream out2("test2.txt",ios::out);
Параметры у конструкторов классов ifstream, ofstream, fstream совпадают с соответствующими параметрами функции open().
Чтобы закрыть файл после использования необходимо вызвать функцию close(), например:
out1.close();
Пример создания и открытия файла:
#include <fstream>
using namespace std;
int main()
{ofstream out1("test1.txt");
//или так:
//ofstream out1("test1.txt",ios::out);
out1.close();
return 0;
}
Чтение и запись текстовых файлов
Проще всего считывать данные из текстового файла или записывать их в него с помощью операторов << и >>. Например, в следующей программе выполняется запись в файл целого числа и строки:
#include <fstream>
using namespace std;
int main()
{ofstream out1("test1.txt");
if(!out1)
{cout<< "НЕ удается открыть файл.\n";
return 1;
}
out1 << "Это пример ФАЙЛА. \n";
out1 << 10;
out1.close();
return 0;
}
Следующая программа считывает строку и целое число из файла, созданного при выполнении предыдущей программы:
#include <fstream>
#include <iostream>
#include <conio.h>
using namespace std;
int main()
{int x; char str[80];
ifstream in("test1.txt");
if(!in)
{cout<< "НЕ удается открыть файл.\n";
return 1;
}
in >> str; in >> x;
cout << str << " " << x << "\n";
in.close();
getch(); return 0;
}
Следует иметь в виду, что при использовании оператора >> для считывания данных из текстовых файлов пробельные символы могут опускаться, кроме того, ввод данных прекращается при обнаружении первого пробельного символа.
Файлы произвольного доступа
Последовательный доступ – наиболее распространенный метод доступа к файлам. Однако, возможен и другой тип доступа.
До сих пор рассматривались только файлы последовательного доступа. Данные, которые записываются в файл последовательного доступа, не могут модифицироваться без риска разрушения остальных данных в файле. Файлы последовательного доступа не подходят для приложений с так называемым «немедленным доступом», в которых конкретная запись информации должна быть локализована немедленно. Примерами таки приложений с немедленным доступом являются, например, системы бронирования билетов, банковские системы, системы терминалов для электронных платежей и др.
Немедленный доступ становится возможным с помощью файлов произвольного доступа. Отдельные записи файла произвольного доступа могут быть доступны для чтения и модификации сразу без предварительного поиска.
Для работы с файлами произвольного доступа используются функции:
write – для записи данных в файл
read – для чтения данных из файла
seekp – для установки позиции чтения-записи.