Скачиваний:
62
Добавлен:
05.07.2021
Размер:
94.13 Кб
Скачать

Тема 4. Файловый ввод/вывод

Файл – это группа байтов, сохраненных на некотором устройстве или жестком диске. ОС управляет файлами, отслеживая их местоположение, размер, дату создания, атрибуты доступа и др.

14 апр 2021

Лекция 10

Некоторые реализации C++ требуют вызова метода clear() в конце программы, а некоторые нет. Это зависит от того, сбрасывается ли состояние потока автоматически при ассоциировании нового файла с объектом типа ifstream. Использование метода clear() не повредит, даже если происходит сбрасывание состояния файла. Это перестраховка.

Режимы открытия файла

Режим открытия файла указывает, как файл будет использоваться: для чтения или для записи. Либо одновременно и для чтения, и для записи.

При ассоциировании потока с файлом либо инициализацией объекта файлового потока именем файла, либо с помощью метода open() можно указать второй аргумент, описывающий режим открытия.

Класс iosbase определяет тип openmode, режим взаимодействия с потоком.

Подобно типам fintflex и iostate, тип openmode представляет собой тип bitmask. Варианты:

  • ios base::app (предназначен для помещения указателя в конец потока перед каждой вставкой)

  • ios base::ate (предназначен для перемещения в конец потока при создании объекта)

  • ios base::binary

  • ios base::in

  • ios base::out

  • ios base::trunc (предназначен для удаления существующего файла при создании объекта.)

Прототипы конструкторов классов ifstream и ofstream, а также метод open() предусматривают значение по умолчанию для аргумента, описывающего режим открытия.

Метод open() и конструктор класса ifstream в качестве значения по умолчанию для аргумента режима открытия используют iosbase::in. А метод open() и конструктор класса ofstream в качестве значения по умолчанию применяют iosbase::out.

В классе fstream режим по умолчанию указан как iosbase::in | iosbase::out, или iosbase::out | iosbase::trunc. Поэтому при создании объектов типа fstream режим открытия также можно не указывать.

Битовая операция «или» | служит для объединения двух битовых значений в одно.

Флаг iosbase::trunc приводит к усечению содержимого в файле, что может быть использовано для предотвращения переполнения дискового пространства. Но нежелательно, если содержимое файла должно остаться.

Если не используется режим по умолчанию, то наиб удойным является явное указание всех элементов режима. Некоторые компиляторы поддерживают не все режимы.

Стандарт С++ определяет части эквивалентных стандартов из стандарта ввода/вывода ANSI C.

Бинарные файлы

Необходимость в бинарных файлах:

      1. операции I/O чаще происходят быстрее

      2. меньше, чем текстовые файлы

      3. есть данные, которые не могут быть конвертированы в файл

Текстовая форма обозначает, что хранение данных происходит в виде текста. Сохранение числа в виде текста требует, чтобы преобразования в символьную форму, что решает операция вставки. Бинарный формат любой информации, хранение внутреннего компьютерного представления информации. Вместо хранения символов как правило 64-разрядное представление числа. Текстовый формат – для возможности чтения. Бинарный формат – более точен для представления чисел. Позволяет избежать связанных с ошибками преобразования ошибок и аргументов.

Работа выполняется быстрее, так как не требует никаких преобразований. Но при передаче данных из одной системы в другую высока вероятность ошибки различных представлений битовых значений.

В некоторых системах (Windows) поддерживается два формата. Символ перехода на новую строчку. Текстовые файлы м/разделять строки ТОЛЬКО с исп. Символа возврата каретки. Unix/Linux В С++ записывают в файл автоматически преобразуя новую строку комбинацию возврат каретки и перевод строки. Но на других ОС могут быть произведены с помощью каретки. При чтении таких данных необходимо корректное преобразование этих комбинаций. В бинарном эти детали можно не учитывать, так как метод gide без преобразований. Приведение адреса к типу указателя типа char. Если классы имеют виртуальные метода, то при такой записи будет скопирован указатель на таблицу указателей, дальней функции, при следующем вызове будет хаос.

21 апр 2021