Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Метод.Бабий М.С.doc
Скачиваний:
7
Добавлен:
19.04.2015
Размер:
150.02 Кб
Скачать

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; }

}