Використання дескрипторів файлів
В мові С передбачений ще один механізм роботи з файлами - використання дескрипторів. Файли, які відкриваються таким чином, не розраховані на роботу з буферами та форматованими даними. На початку роботи будь-якої програми відкриваються п'ять стандартних потоків зі своїми дескрипторами.
Таблиця 3 - Дескриптори стандартних потоків введення-виведення
потік | дескриптор | |
stdin | 0 | стандартний вхідний потік |
stdout | 1 | стандартний вихідний потік |
stderr | 2 | стандартний потік повідомлень про помилки |
stdaux | 3 | стандартний потік зовнішнього пристрою |
stdprn | 4 | стандартний потік виведення на принтер |
Але будь-яка програма може і явним чином відкривати будь-які файли з дескрипторами.
Функції, які працюють з дескрипторами файлів, описані в модулі io.h. Файл відкривається функцією open(), яка повертає дескриптор файлу:
int open(const char *path, int access [ , unsigned mode ] );
де path задає ім'я файлу відкриття;
access визначає режим доступу до файлу;
mode є не обов'язковим та задає режим відкриття файла.
Параметр access формується за допомогою операціїлогічного складання з переліку прапорців.
Таблиця 4 - Допустимі значення параметру access
O_RDONLY | тільки для читання |
O_WRONLY | тільки для запису |
O_RDWR | для читання і запису |
O_CREAT | створення нового файлу |
O_TRUNC | якщо файл існує, то він стає порожнім |
O_BINARY | двійковий файл |
O_TEXT | текстовий файл |
Таблиця 5 - Допустимі значення параметру mode
S_IWRITE | дозволити запис |
S_IREAD | дозволити читання |
Приклад 6. Використання дескрипторів файлів.
#include <string.h>
#include <stdio.h>
#include <fcntl.h>
#include <io.h>
int main(void)
{
int handle;
char msg[] = "Hello world";
if ((handle = open("TEST.TXT", O_CREAT | O_TEXT)) == -1)
{
perror("Error:");
return 1;
}
write(handle, msg, strlen(msg));
close(handle);
return 0;
}
Як видно з прикладу, файл, відкритий функцією open() повинен бути закритий за допомогою функції close().
int close(int handle);
Читання і запис даних при роботі з файлами, що визначаються дескрипторами handle, здійснюється функціями write() і read().
int read(int handle, void *buf, unsigned len);
int write(int handle, void *buf, unsigned len);
де buf - покажчик на буфер, з якого записується в файл інформація, або в який читається; len - кількість байтів запису або читання з файла.