Глава 13. Обзор потоков ввода-вывода___________________________32?

Что касается файлов, то они тоже могут быть далеко не одинаковыми. Отличия между файлами определяют режим, задаваемый при их открытии. Текстовые файлы состоят из строк, и функция get line предназначена для работы именно с текстовыми файлами. Файлы другой разновидности — двоичные, или бинарные — могут содержать структурированные данные (так называемые записи) или просто массив данных, как, например, графику. Понятно, что бессмысленно открывать двоичный файл в текстовом режиме и пытаться читать его построчно.

Учитывая вышеизложенное, делаем вывод, что пользователи (т. е. программисты, использующие эти классы) должны располагать возможностями задавать режим открытия файлов. Это достигается указанием режима при создании экземпляра объекта. Существуют четыре различных конструктора класса ofstream; рассмотрим тот, с которым мы уже имели дело.

Этот конструктор позволяет задавать от одного до трех аргументов; из них обязательным является только первый, а остальные два по умолчанию принимают предопределенные значения. В нашем примере мы согласились с этими стандартными значениями, а первым параметром передали имя файла. Второй аргумент — это режим открытия файла, его возможные значения принадлежат к перечисляемому типу open_mode и определены в классе ios. Глядя на объявление

of stream(const char *name, int mode = ios::out, int prot = 4>filebuf::openprot) ;

вы видите, что доступ к этим значениям обеспечивается указанием имени класса ios и операцией разрешения области видимости (::). Режим открытия файла можно задавать также, комбинируя флаги режима при помощи логических операций. Например, чтобы открыть файл в двоичном режиме, надо в качестве второго аргумента подставить следующее выражение:

ofstream out( "SAMPLE.BIN", ios::out ] ios::binary);

// третий аргумент не задаем

Замечание

В этом разделе мы мимоходом затрагиваем массу интересных тем. Одна из них— как задается начальное значение при объявлении переменной и почему это похоже на вызов функции. Или, например, как можно задавать различные значения аргументов тому, что явно является одним и тем же экземпляром.

Рассмотрение этих вопросов мы отложим до более подходящего случая. В конце этой главы в разделе "Далее..." указано, где искать соответствующий материал.

И для ifstream, и для ofstream можно использовать стандартный конструктор файлового потока, оставив открытие файла на потом. Этот прием демонстрирует следующий фрагмент: