[<<Previous Entry] [^^Up^^] [Next Entry>>] [Menu] [About The Guide]
 Получение информации о служащих - Пример

В этом примере, запись о служащем выводится по ее номеру. Нумерация
начинается с 1. lseek(2) используется для перемещения позиции файла к
необходимой записи. Схема работает, только если все записи имеют
одинаковую длину.
Программа работает следующим образом:
7-10 Перечисляются некоторые включаемые файлы. <unistd.h> определяет
символьные константы SEEK_SET, SEEK_CUR, SEEK_END.
15-16     Объявляется запись о служащих и заголовок записи.
17   Объявлен массив из двух структур iovec.
24-27     Каждый элемент массива iov инициализируется адресом буфера и
длиной области памяти, откуда будут прочитаны данные.
29-41     В этом цикле пользователь вводит номер записи. lseek(2)
помещает позицию на начало требуемой записи. readv(2) пытается
прочесть данные заголовка и данные самой записи. readv(2) возвращает
число прочитанных байт, если чтение произошло успешно. Иначе выводится
сообщение "не найдено". Такое сообщение может возникнуть при попытке
чтения за концом файла.
Файл: inquire.c
               ПОЛУЧЕНИЕ ИНФОРМАЦИИ О СЛУЖАЩИХ - ПРИМЕР

 7 #include <unistd.h>
 8 #include <sys/uio.h>
 9 #include "employee.h"
10 #include "empheader.h"
11
12 main(int argc, char *argv[])
13 {
14     int fd, recnum;
15     struct employee record;
16     struct recheader header;
17     struct iovec iov[2];
...
24     iov[0].iov_base = (caddr_t)&header;
25     iov[1].iov_base = (caddr_t)&record;
26     iov[0].iov_len = sizeof(header);
27     iov[1].iov_len = sizeof(record);
28
29     for (;;) {
30    printf("\nEnter record number: ");
31    scanf("%d", &recnum);
32    if (recnum == 0)
33        break;
34    lseek(fd, (recnum-1)*(sizeof(record)+sizeof(header)
35        SEEK_SET);
36    if (readv(fd, iov, 2) > 0)
37        printf("Employee: %s\tSalary: %d\n",
38       record.name, record.salary);
39    else
40        printf("Record %d not found\n", recnum);
41     }
42     close(fd);
43     exit(0);
44 }