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

mode – режим – целая статическая константа размером в 1 бит; режимы можно объединять битовой операцией ‘ | ‘:

               ios::in;     //открытие файла для ввода

               ios::out;    //открытие файла для вывода

               ios:: ate    //режим поиска конца файла при его открытии

//однако операции ввода-вывода возможны в любом месте файла

               ios::app    //режим добавления в конец файла, открытого для вывода

               ios::trunс  //удаление содержимого ранее существовавшего файла

               ios::nocreate  //не открывать новый файл                                                  //(для несуществующего файла функция выдаст ошибку)

               ios::noreplace  //не открывать новый файл (для существующего выходного                                                  //файла, не имеющего режимов ate или app,                                                 // функция выдаст ошибку)

               ios::binary  //открытие файла в двоичном режиме (по умолчанию – текстовый)

При открытии разрешается задавать следующие комбинации режимов:

out|trunс – стирание и запись (файл создается, если его нет)

out|app – дозапись (файл создается, если его нет)

in|out – чтение и запись (файл должен существовать)

in|out|trunс – стирание, чтение и запись (файл создается при его отсутствии).

Вызов функции open() осуществляется с помощью уточненного имени:

outFile.open(“C:\\USER\\RESULT.DAT”); //файл, если не существовал, будет создан,                                              // откроется только для вывода в него данных в текстовом режиме                                                                           // и будет подсоединен к потоку outFile

inFile.open(“RESULT.DAT”); //файл, если существует,  откроется только для чтения                                                         //из него данных в текстовом режиме и будет подсоединен                                                          // к потоку inFile; в противном случае – ошибка ввода

ioFile.open(“RESULT.DAT”, ios::out); //файл, если не существовал,  будет создан,                                          //откроется для вывода  в него данных в текстовом режиме                                                          // и будет подсоединен к потоку ioFile

Если значение параметра mode соответствует типу открываемого потока (для ввода – in, для вывода – out и т.д.), то параметр mode можно не задавать (он установится по умолчанию).

Заметим, что для потоков класса fstream, т.е. открываемых для ввода и вывода, второй аргумент должен быть задан обязательно, т.к. по умолчанию неясно, в каком направлении предполагается выполнять обмен с потоком. Для изменения направления обмена с потоком, необходимо предварительно закрыть файл с помощью функции close(), и повторно открыть его.

Хотя использовать функцию open() для открытия файла в целом правильно, часто это не делается, т.к. у классов ifstream, ofstream и fstream есть специальные функции (конструкторы), которые имеют по умолчанию те же параметры, что и функция open(), и открывают файл автоматически. Типы конструкторов для потоков разных классов очень похожи:

имя_класса (); – создает поток, не присоединяя его ни к какому файлу;

имя_класса (intfd); – создает поток и присоединяет его к уже открытому файлу, дескриптор которого используется в качестве параметра fd;

имя_класса (intfd, char *bufint); – создает поток, присоединяя его к уже открытому файлу с дескриптором fd, и использует явно заданный буфер (buf);

имя_класса (char *fileName, intmode, int=…); – создает поток, присоединяет его к файлу с заданным именем filename, а при необходимости, предварительно создает файл с таким именем.

Чаще всего употребляют конструктор без параметров и конструктор, в котором явно указано имя файла.

Если имеем использование конструкторов без параметров:

ifstream fi; //создание входного файлового потока fi

ofstream.fo; //создание выходного файлового потока fo