
- •Лабораторная работа №6. Запись / чтение структуры из файла. Теоретическая часть
- •Открытие и закрытие файлов
- •Класс istream
- •Функции get, getline и read
- •Функция возвращения
- •Позиционирование потока
- •Класс ostream
- •Функции вывода put и write
- •Функции класса filebuf
- •Функции класса streambuf
- •Функции класса strstreambuf
- •Определение состояния потока
- •Работа со списком.
- •Работа со списками через файл.
- •Контрольные вопросы:
- •Порядок выполнения лабораторной работы:
- •Практическая часть. Индивидуальные задания.
Лабораторная работа №6. Запись / чтение структуры из файла. Теоретическая часть
Файловый ввод-вывод в языке С++
Функция |
Назначение |
open |
Открывает файл для чтения/записи, связывая с ним объект класса filebuf |
close |
Закрывает файл |
setbuf
|
Передает указанный символьный буфер в распоряжение объекта класса filebuf |
setmode
|
Задает режим доступа к файлу: двоичный (константа filebuf::binary) или текстовый (константа filebuf::text) |
attach |
Связывает указанный открытый файл с объектом класса filebuf |
rdbuf |
Возвращает указатель на объект класса filebuf |
fd |
Возвращает дескриптор класса |
is_open |
Проверяет, открыт ли файл, связанный с потоком |
Для работы с файлами необходимо подключить библиотеку FSTREAM.H (которая в свою очередь подключает файл iostream.h).
Для чтения данных из файла используется класс ifstream, являющийся потомком класса istream. Для записи данных в файл используется класс ofstream, являющийся потомком класса ostream. Для чтения данных и записи из файла используется класс fstream. Конструктор каждого из этих классов автоматически создает объект класса filebuf, управляющий низкоуровневой работой с файлом, включая поддержку буфера чтения. Функции классов ifstream, ofstream и iofstream приведены в таблице.
Открытие и закрытие файлов
Для открытия файла можно использовать конструкторы ifstream, ofstream или fstream.
Форма записи:
ИмяКласса ИмяОбъекта (СтрокаПутьФайл [ , Флаг])
В качестве имени класса должен находиться любой класс, содержащий функции работы с файлами (например, ifstream или ofstream, istream или ostream , или fstream). В качестве ИмяОбъекта любой допустимый идентификатор. СтрокаПутьФайл представляет собой строку, содержащую информацию о месторасположении файла плюс его имя и расширение. При вводе имени файла с клавиатуры с указанием пути и расширения файла, если они требуются, данные вводятся в обычном виде, например: c:\1\date.txt
Если же путь, имя файла и его расширение задаются в самой программе, то надо указывать их с использованием двойной наклонной черты, т.к. одиночная наклонная черта обозначает управляющий символ и путь будет прочитан неверно, например:
fstream f(“c:\\1\\date.txt”,ios::in);
ifstream fi(“c:\\1\\file1.doc”);
ofstream fo(“file2.in”);
наличие флага необязательно. Флаг используется, если необходимо изменить режим доступа к файлу.
Флаг |
Назначение |
ios:: in ios::out ios::ate
ios::app ios::trunc
ios::nocreate ios::noreplace ios::binary |
Файл открывается для чтения, его содержимое не очищается Файл открывается для записи После создания объекта маркер текущей позиции устанавливается в конец файла Все выводимые данные добавляются в конец файла Если файл существует, его содержимое очищается (автоматически устанавливается при открытии файла для записи) Объект не будет создан, если файл не существует Объект не будет создан, если файл существует Файл открывается в двоичном режиме (по умолчанию – в текстовом) |
Допускается объединение флагов с помощью операции побитового ИЛИ.
Пример:
ofstream fo1(“c:\\file1.doc”, ios:: noreplace );
ofstream fо2(“file2.in”, ios::app| ios::nocreate);
В первом случае делается попытка создать объект fо1 и связать его с файлом file1.doc. Т.к. указан флаг ios:: noreplace, объект не будет создан, если файл существует, что предохраняет пользователя от нечаянного использования существующего файла для записи в него новых данных.
Во втором случае делается попытка создать объект fо2 и связать его с файлом file2.in. Т.к. указан флаг ios::nocreate, объект не будет создан, если файл не существует, а если он существует, то после создания объекта данные будут заносится в конец файла ( при этом исходные данные, хранимые в этом файле не уничтожаются).
Для обмена данными с файлом можно использовать объект класса fstream.
Например:
fstream io(“fl.dat”,ios::in|ios::app); открывает файл для записи и чтения одновременно.
Для закрытия файлов применяется метод close, который опорожняет поток и закрывает закрепленный за потоком файл.
Пример:
#include<iostream.h>
#include<fstream.h>
void main()
{
char name[12];
cout<<”Введите имя файла”<<endl;
cin>>name;
fstream f(name,ios::in);
if(f) cout<<”Файл открыт успешно”;
f.close();
}
Для открытия файлов можно использовать функцию open.
Пример:
#include<iostream.h>
#include<fstream.h>
void main()
{
fstream f;
char name[12];
cout<<”Введите имя файла”<<endl;
cin>>name;
f.open(name,ios::in);
if(f) cout<<”Файл открыт успешно”;
f.close();
}
Параметры, требуемые функцией open, имеют тот же смысл, что и параметры конструкторов потока.
Для записи данных в файл достаточно указать вместо потока cin имя объекта, связанного с файлом.
Пример:
#include<iostream.h>
void main()
{
char name[30];
cout<<”Введите имя файла:”<<endl;
cin>>name;
fstream f;
f.open(name, ios::out|ios::ate);
f<<”Добавляем запись”;
f.close();
}