Файлы. Общая концепция организации ввода-вывода данных в С++. Средства класса ios, обеспечивающие точную настройку вывода, страница 14

Двоичные (бинарные) файлы не являются форматируемыми. Они не разбиваются на строки, никаких преобразований при обмене не выполняется, поэтому операции обмена выполняются быстрее. Пример двоичного файла – исполняемый файл с расширением exe. При операции записи в двоичный файл попадает ровно столько байтов, сколько записываемый объект занимает в памяти (например, для целого числа – sizeof (int) байтов). В случае, если двоичный файл есть последовательность однотипных элементов, с ним можно работать и как с файлом последовательного доступа, и как с файлом прямого доступа, в котором возможен непосредственный доступ к любому из его элементов.

Хотя текстовые файлы полезны во многих случаях и содержат удобный для восприятия человека текст, у них нет гибкости неформатированных двоичных файлов, содержащих исходные двоичные  данные во внутреннем представлении, непосредственно используемом программой. О неформатированном вводе-выводе иногда говорят как о «сыром» вводе-выводе или вводе-выводе «низкого» уровня.

При работе с файлами необходимо знать:

¨  текстовые файлы могут создаваться с помощью тестового редактора и содержать данные разных типов;

¨  элементы двоичных файлов хранятся во внутреннем представлении и поэтому должны создаваться программно;

¨  двоичные файлы также могут содержать элементы разных типов, но для большей надежности их следует формировать из элементов только определенного типа;

¨  даже для последовательной обработки однотипных данных двоичный файл предпочтительнее текстового как в отношении надежности, так и в отношении экономичности (скорости выполнения операций);

¨  благодаря возможности прямого доступа к своим элементам двоичные файлы представляются очень привлекательными при чередовании операций чтения и записи данных.

Программа на С++ имеет дело с абстрактным потоком, представленным в программе обычной переменной. Эта переменная имеет область видимости и время жизни в соответствии с описанием и не имеет никакого отношения к файлам на диске. Чтобы иметь возможность работать с файлом, необходимо как-то связать с ним переменную-поток. Обычно эта связь задается либо при открытии файла, либо при создании потока.

При закрытии файла связь разрывается (т.е. разрывается связь только переменной-потока с внешним файлом, сама переменная продолжает «жить» в соответствии с описанием и может быть снова связана с тем же или с другим файлом). При закрытии файла буфер освобождается – выводится в файл на внешнее устройство. Если программа заканчивается аварийно, файлы остаются незакрытыми, и последняя порция информации на диск не попадает.

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

Рассматривая взаимосвязь файлов с потоками ввода-вывода, нужно отметить существование следующих процедур:

1 –  создание файла;           // файл на диске представлен именем и не имеет отношения к потоку

2 – создание потока;            //определение переменной потокового типа

3 – открытие файла;              //явно, методом open(), неявно конструктором при создании потока

4 – открытие потока           //неявно конструктором при создании потока

5 – «присоединение» файла к потоку;        //связь устанавливается при открытии файла

6 – обмен с файлом с помощью потока; //по умолчанию форматируемый поток и соотносится                                                                                                 // с текстовым файлом на диске

7 – «отсоединение» потока от файла; //при закрытии файла связь разрывается,                                                                                                        //переменная – продолжает жить

8 – закрытие файла;      //явно, методом close(), неявно деструктором при завершении программы

9 – уничтожение потока.

1. Создание файла

может быть выполнено с помощью библиотечной функцииcreat():

int creat (const char *path, int amode); // заголовочный файл io.h