Перечисленные константы размещены в заголовочном файле stat.h, находящемся в каталоге sys системы программирования Си. Обычно его подключение осуществляется директивой #include <sys\stat.h>.
Если параметр права_доступа не указан, то устанавливается разрешение только на чтение из файла. Чаще всего в операционных системах MS-DOS и Windows этот параметр не используется.
В UNIX в силу того, то она является многопользовательской, система защиты файлов более развита. Права доступа к файлам устанавливаются для трех категорий пользователей:
• владелец файла;
• участник группы пользователей;
• прочие пользователи.
Права доступа к конкретному файлу устанавливаются владельцем файла специальными командами. Права доступа отображаются при просмотре оглавления каталога командой Is -I в виде символьной строки, которая формируется по следующему правилу: для каждой группы пользователей в строке прав доступа выделяется 3 символа, каждый из которых может принимать следующие значения:
r- разрешено чтение из файла;
w - разрешена запись в файл;
x- разрешено выполнение файла (для файлов, хранящих исполняемую программу).
Символы r, w, x задаются строго на своих местах в указанном порядке (rwx). Если какой-либо из типов доступа к файлу запрещен, на месте соответствующего символа записывается символ '-' (минус). Таким образом, если для владельца файла разрешены все виды доступа к файлу (rwx), для участника группы пользователей - только чтение и выполнение (r-х),а для прочих пользователей - только выполнение (--х), то строка прав доступа будет выглядеть так:
От этой строки символов легко перейти к собственно параметру права_доступа, являющемуся целым числом. Если на соответствующем месте в строке указан символ, отличный от '-', то записывают '1', иначе - записывают '0'. Получившееся двоичное число (111101001) переводят в восьмеричное, записав в виде восьмеричной цифры каждую группу из трех двоичных цифр, начиная с самой правойгруппы: 0751. Это число и следует указать в качестве параметра права_доступа в функции ореn( ).
Приведем несколько примеров открытия файла.
1. Открыть файл для чтения:
2. Открыть существующий файл для записи новых данных:
Параметр права_доступа, заданный восьмеричной константой 0600 (для UNIX), в символьном изображении имеет вид rw-------, т.е. для владельца файла разрешены чтение и запись, для двух других категорий пользователей не разрешен ни один из видов доступа к файлу. Если файл с именем new.txt существует, то перед записью новых данных он будет усечен до нулевого размера (очищен). При открытии файла с указанными параметрами в других ОС параметр права_доступа опускается.
3. Открыть файл для добавления:
4. Открыть файл для чтения и записи:
5. Создать новый файл для записи:
В операционной системе UNIX такая последовательность операторов открывает новый файл для записи. Если файл не существует, то он создается. Иначе функция завершается неудачей. Флаг O_EXCLспециально задан для предотвращения непреднамеренного уничтожения уже существующего файла. Этот флаг используется совместно с O_CREAT.Права доступа (rw-rw-rw-) разрешают чтение и запись в файл для всех категорий пользователей. В других ОС параметр права_доступа должен быть опущен.
Приведем более полный пример создания файла (MS-DOS, Windows):
Создаваемый файл в соответствии с выбранными флагами открывается для чтения и записи. Права доступа (rw---) позволяют только владельцу работать с файлом (читать и писать).
Для идентификации ошибок, возникающих при открытии файла, используется именующее выражение (переменная) errno,определенное в заголовочном файле errno.h.При выполнении функций стандартной библиотеки в область памяти, именуемой errno,записываются коды ошибок. Предопределенная в errno.hконстанта EEXISTозначает, что файл, указанный в функции ореп(),уже существует. В этом примере для вывода сообщения об ошибке применена функция форматного вывода в файл fprintf( ), в которой использован предопределенный дескриптор файла stderrстандартного потока для вывода сообщений об ошибках.
Кроме функции ореn( ), для открытия файла можно использовать функцию creat( ),упомянутую в начале параграфа. Функция creat( ) полностью эквивалентна такому вызову функции ореn( ):
open(имя_фаила, O_CREAT|O_TRUNC|O_WRONLY);
Функция creat( ) создает новый файл и открывает его для записи. Наличие в библиотеке наряду с функцией ореn( )функции creat( ) вызвано требованиями совместимости с ранними версиями UNIX, имевшими только три основных режима открытия файла (O_RDONLY, O_WRONLY, O_RD\VR),что вынуждало использовать для создания нового файла специальную функцию creat( ).
Так же как и при использовании потоков, в начале работы каждой программы автоматически открываются файлы стандартного ввода, стандартного вывода и стандартного вывода сообщений об ошибках. Эти файлы имеют значения дескрипторов файлов 0, 1 и 2, которые можно использовать при обменах на нижнем уровне со стандартными файлами.
Необходимо иметь в виду, что в каждой операционной системе имеется ограничение на количество одновременно открытых в программе файлов. Обычно их число устанавливается от 20 до 40. Во время работы программы, в которой обрабатывается большое количество файлов, необходимо своевременно закрывать ненужные файлы. Для закрытия файла на нижнем уровне служит функция close(),прототип которой имеет вид:
int close(дескриптор_файла);
Функция close( ) при успешном завершении возвращает 0. В случае ошибки возвращается -1.
При завершении программы все открытые файлы автоматически закрываются.