Довільний доступ – Iseek

Зазвичай введення-виведення виконується послідовно: кожна операція читання або запису починається там, де закінчилася попередня Але при необхідності файл може бути прочитаний і записаний в довільному порядку Системний виклик lseek дозволяє переміщатися по фай лу, не виконуючи при цьому читання або запис:

int fd, origin

long  offset,  pos,  lseek()

pos  = lseek(fd, offset,  origin)

В цьому фрагменті поточна позиція у файлі з дескриптором fd переміщається на offset байт щодо позиції, визначеної параметром origin Наступна операція читання або запису почнеться з цієї позиції Параметр origin може приймати значення 0, 1 і 2, при цьому зміщення відлічується від початку файлу, від поточної позиції і від кінця файлу відповідно Функція повертає нове значення абсолютної позиції або -1 у разі помилки Наприклад, щоб дописати дані в файл, перейдіть на його кінець:

lseek(fd, 0L,  2)

Щоб повернутися на початок («перемотати»),

lseek(fd, 0L,  0)

Щоб визначити поточну позицію,

pos  = lseek(fd, 0L,  1)

Зверніть увагу на аргумент 0L: зміщення – це довге ціле (Буква «l» в імені lseek означає long, тобто «довге», що відрізняє цю функцію від seek з шостої версії, що використовує короткі цілі)

Функція lseek дозволяє з деякою мірою наближення трактувати файли як великі масиви, правда ціною більш повільного доступу Ось, наприклад, функція, що читає довільну кількість байт з довільного місця файлу:

get (fd, pos, buf, n) / * прочитати n байт з позиції pos * / int fd, n

long  pos char  *buf

{

if (lseek (fd, pos, 0) == -1) / * перейти на позицію pos * / return -1

else

return read(fd, buf, n)

Вправа 73 Змініть функцію readslow так, щоб вона обробляла імя файлу, якщо його передано параметром Додайте параметр-e:

$ readslow  -e

що змушує readslow переміщатися в кінець вхідного файлу перед початком читання Як поведе себе lseek при роботі з програмним каналом (pipe) ~

Вправа 74Перепишіть функцію efopen з глави 6 з використанням виклику error ~

Джерело: Керниган Б, Пайк Р, UNIX Програмне оточення – Пер з англ – СПб: Символ-Плюс, 2003 – 416 с, Мул

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*