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