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

Эта функция по заданному имени файла path создает новый файл или «очищает» и подготавливает для работы уже существующий. Параметр amode определяет режим доступа к создаваемому файлу:

S_IWRITE – разрешена запись в файл;

S_IREAD – разрешено только чтение из файла;

S_IREAD|S_IWRITE – разрешены и чтение, и запись.

Для использования констант необходимо включить директиву #include <sys/stat.h>

Файл создается для работы в текстовом (по умолчанию) или двоичном режиме обмена. Программист может явно изменить режим обмена:

_fmode = O_BINARY; //переменная _fmode определена в stdlib.h и                                                 //ответственна за режим обмена

_fmode = O_TEXT; //(по умолчанию)

Для использования констант необходимо включить директиву #include <fcntl.h>

Если файл с полным именем *path не существует, то он создается заново, для него устанавливается режим доступа (по значению параметра amode) и выбирается режим обмена (текстовый или двоичный).

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

Если файл с полным именем *path существует и для него определен режим доступа «запись», функция creat() обнуляет длину файла, оставляя неизменными атрибуты его режимов.

При успешном завершении функция creat() возвращает неотрицательное целое число – дескриптор файла, в противном случае – (-1).

Пример создания файла с проверкой результата:

 #include <io.h>               //для функции creat()

#include <iostream.h>

#include <stdlib.h>           //для exit()                                                      

#include <sys\stat.h>    //для S_IWRITE

………

char *fileName1= “EXAMPLE1.CPP”;  //файл будет создаваться в текущем каталоге

int fileNumb1;

fileNumb1= creat(fileName1, S_IWRITE);   //файл создается как текстовый для записи

if (fileNumb1 ==-1)

{cerr<< “error”;

     exit(1);

}

…….

char *fileName2= “c:\\test\\EXAMPLE2.bin”;  //файл создается в каталоге c:\test

_fmode = O_BINARY;                                     //файл создается как двоичный

fileNumb2=creat(fileName2,S_IREAD|S_IWRITE); //файл создается для чтения/записи

char *fileName3= “c:/test/EXAMPLE3.CPP”;  //файл также создается в каталоге c:\test

2. Потоки для работы с файлами

создаются как объекты классов, содержащихся в стандартной библиотеке:

ifstream             // для ввода (чтения) данных из файла

ofstream            // для вывода (записи) данных в файл

fstream              // для ввода и вывода данных (двунаправленный обмен)

Поток (потоковую переменную, объект соответствующего класса) можно определить следующим образом:

ifstreaminFile;             //определение потоковой переменной для ввода

ofstreamoutFile;         //определение потоковой переменной для вывода

fstreamioFile;             //определение потоковой переменной для ввода и вывода

При этом имя потока связывается с выделяемым для него буфером и инициализируются переменные состояния потока.

3. Открытие файла и связывание его с файловым потоком

Теперь необходимо открыть соответствующий файл и связать его с файловым потоком. Существуют функции стандартной библиотеки языка С для открытия файлов fopen() и open(). Но в С++ удобнее пользоваться компонентными функциями соответствующих классов. В данном случае после создания потока, одним из способов связать его с файлом является компонентная функция open() (член каждого из названных потоковых классов).

Прототипы функции для каждого класса выглядят так:

void  ifstream::open (const char*  fileName, open_mode mode = ios::in);

void  ofstream::open (const char*  fileName, open_mode mode = ios::out | ios::trunc);

void  ffstream::open (const char*  fileName, open_mode mode = ios::in | ios::out);

здесь fileName – имя файла, которое может входить в спецификатор пути;