русс | укр

Мови програмуванняВідео уроки php mysqlПаскальСіАсемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование


Linux Unix Алгоритмічні мови Архітектура мікроконтролерів Введення в розробку розподілених інформаційних систем Дискретна математика Інформаційне обслуговування користувачів Інформація та моделювання в управлінні виробництвом Комп'ютерна графіка Лекції


Довільний доступ - lseek


Дата додавання: 2014-11-28; переглядів: 846.


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

long lseek(int fd, long offset, int origin);

що встановлює поточну позицію файла, чий дескриптор дорівнює fd, до offset (зміщення), яке обчислюється відносно положення, вказаного origin. Послідовне читання чи запис почнеться саме з цієї позиції. origin може дорівнювати 0, 1 або 2, щоб вказати, що зміщення (offset) обчислюватиметься з початку, з поточної позиції, або з кінця файла, відповідно. Наприклад, для додання (доточування) до файла (перенаправлення >> в оболонці UNIX, або «a» у випадкуfopen), знайдіть кінець до того як записувати:

lseek(fd, 0L, 2);

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

lseek(fd, 0L, 0);

Зверніть увагу на аргумент 0L; його можна було би записати як (long) 0, або просто як 0, якщо lseek оголошено відповідним чином.

Завдяки lseek, файли можна розглядати приблизно як масиви, ціною будучи повільніший доступ. Наприклад, наступна функція читає будь-яку кількість байтів з будь-якого місця всередині файла. Вона повертає прочитане число, або -1 при помилці.

#include "syscalls.h"

 

/* get: читає n байтів, починаючи з позиції pos */

int get(int fd, long pos, char *buf, int n)

{

if (lseek(fd, pos, 0) >= 0) /* переміщає в pos */

return read(fd, buf, n);

else

return -1;

}

Значення, повернуте lseek, буде число типу long, яке вказує на нове положення всередині файла, або -1, якщо сталася помилка. Функція стандартної бібліотеки fseek є аналогічноюlseek за винятком того, що першим аргументом є FILE *, а повернене значення є просто ненульовим при помилці.


<== попередня лекція | наступна лекція ==>
Open, creat, close, unlink | Приклад: втілення fopen і getc


Онлайн система числення Калькулятор онлайн звичайний Науковий калькулятор онлайн