Інформатика
Файловий потік : Використання дескрипторів файлів
 

Використання дескрипторів файлів

     В мові С передбачений ще один механізм роботи з файлами - використання дескрипторів. Файли, які відкриваються таким чином, не розраховані на роботу з буферами та форматованими даними. На початку роботи будь-якої програми відкриваються п'ять стандартних потоків зі своїми дескрипторами.

Таблиця 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 - кількість байтів запису або читання з файла.

 
© 2008 ХНУРЭ, Інформатики, Сінельнікова Т.Ф., informatika@kture.Kharkov.ua
Розроблено за допомогою LERSUS