Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторная работа6.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
169.98 Кб
Скачать

Лабораторная работа №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();

}