4 Файловые функции Unix
Для работы с файловой системой используются следующие функции Unix [2]:
int open (const char* path, int acces_mode, int permission) -прототип функции находится в fcntl.h, path – путь, permission обычно 0.
Флаги режима доступа: O_RDONLY – для чтения, O_WRONLY – для записи, O_RDWR – для чтения и записи.
Существует также модификатор доступа, например O_CREAT – если файл не существует, он создается.
Функция возвращает дескриптор файла или -1 при ошибке.
int creat (const char* path, int acces_mode) – упрощенный вариант создания файла.
long read (int fdesc, void* buf, int size) – читается блок данных из файла.
Прототип находится в unistd.h, fdesc – файловый дескриптор, buf – адрес буфера, содержащего прочитанные данные, size – количество байтов, которое нужно прочитать из файла.
Функция возвращает количество прочитанных байтов.
long write (int fdesc, const void* buf, int size) – записывает блок данных в файл.
Прототип - в unistd.h, параметры как в read.
Функция возвращает количество байтов, успешно записанных в файл.
long lseek (int fdesc, long pos, int whence) – изменяет текущую позицию указателя чтения-записи в файле.
Прототип - в unistd.h, pos – задает смещение в байтах, которое должно быть прибавлено к базовому адресу для получения нового смещения. Параметр whence задает базовый адрес:
SEEK_CUR – текущий адрес указателя в файле;
SEEK_SET – начало файла;
SEEK_END – конец файла.
Функция возвращает смещение.
5 Пример программы для обработки файла
Программа имеет следующие режимы работы:
1 - создание файла, состоящего из записей следующего содержания: наименование компьютерной техники, количество, цена;
2 - корректировка файла, состоящая в изменении цены конкретного устройства;
3 - просмотр содержания файла.
#include <iostream.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <fcntl.h>
#define STOP ""
struct UNIT
{ char name[20]; int amount;
float price;} work;
int len = sizeof(UNIT);
int fdesc;
char fname[] = "list";
void sozd()
{
fdesc=open (fname, O_WRONLY);
for(int i=1;i<10;i++)
{ puts ("Введите наименование: ");
getchar();
gets (work.name);
if (strcmp(work.name, STOP) == 0) break;
puts ("Введите количество и цену: ");
scanf ("%i%f", &work.amount, &work.price);
write(fdesc, &work, len);
}
close (fdesc);
}
void correct()
{
char s[20]; float c;
puts ("Введите наименование: ");
getchar();
gets(s);
puts ("Введите новую цену: ");
scanf("%f",&c);
fdesc=open (fname, O_RDWR);
for(int i=0;i<10;i++)
{ int res = read(fdesc, &work, sizeof(UNIT));
if (res==0) break;
if (strcmp(work.name, s) == 0)
{ work.price = c;
lseek(fdesc, -len, 1);
write (fdesc, &work, len);
break;
}
}
close(fdesc);
}
void vyvod()
{
fdesc=open (fname, O_RDONLY);
for(int i=0;i<10;i++)
{ int res = read(fdesc,&work, len);
if (res == 0) break;
printf ("name=%s; amount=%i; price=%f;\n",
work.name, work.amount, work.price);
}
close(fdesc);
}
void main()
{
int r;
puts ("Режимы работы:");
puts ("1 - создание файла; 2 - корректировка ; 3 - вывод");
puts ("Введите режим: ");
scanf ("%i", &r);
switch (r) {
case 1 : sozd(); break;
case 2 : correct(); break;
case 3 : vyvod(); break; }
}