13.4.2. Игнорирование указателя файла

13.4.2. Игнорирование указателя файла

Программы, использующие бинарные файлы, часто выглядят, как показано ниже.

lseek(fd, SEEK_SET, offset1);

read(fd, buffer, bufferSize);

offset2 = someOperation(buffer);

lseek(fd, SEEK_SET, offset2);

read(fd, buffer2, bufferSize2);

offset3 = someOperation(buffer2);

lseek(fd, SEEK_SET, offset3);

read(fd, buffer3, bufferSize3);

Необходимость поиска нового расположения с помощью lseek() перед каждым read() удваивает количество системных вызовов, поскольку указатель файла никогда не располагается правильно после read() из-за непоследовательной природы хранения данных в файле. Существуют альтернативы read() и write(), принимающие смещение файла в качестве параметра, и ни одна из альтернатив не использует указатель файла, чтобы выяснить, к какой части файла можно получить доступ, или какую его часть можно обновить. Обе функции работают только применительно к просматриваемым файлам, поскольку непросматриваемые файлы можно читать или записывать только в текущем расположении.

#define XOPEN_SOURCE 500

#include <unistd.h>

size_tpread(int fd, void * buf, size_t count, off_t offset);

size_t pwrite(int fd, void * buf, size_t count, off_t offset);

#endif

Это выглядит подобно прототипам read() и write() с четвертым параметром, offset. offset определяет, с какой точки файла следует читать, а в какую — записывать. Как и их "тезки", эти функции возвращают количество переданных байтов. Ниже приведена версия pread(), реализованная с помощью read() и lseek(), что облегчает понимание ее функции[99].

int pread (int fd, void * data, int size, int offset) {

 int oldOffset;

 int rc;

 int oldErrno;

 /* переместить указатель файла в новое расположение */

 oldOffset = lseek(fd, SEEK_SET, offset);

 if (oldOffset < 0) return -1;

 rc = read(fd, data, size);

 /* восстановить указатель файла, предварительно сохранив errno */

 oldErrno = errno;

 lseek(fd, SEEK_SET, oldOffset);

 errno = oldErrno;

 return rc;

}

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

Н.3 Спецификация указателя

Из книги Информационная технология ПРОЦЕСС СОЗДАНИЯ ДОКУМЕНТАЦИИ ПОЛЬЗОВАТЕЛЯ ПРОГРАММНОГО СРЕДСТВА автора Автор неизвестен


Игнорирование файла политики публикации

Из книги Язык программирования С# 2005 и платформа .NET 2.0. [3-е издание] автора Троелсен Эндрю

Игнорирование файла политики публикации Теперь предположим, что вы (как администратор системы) установили файл политики публикации (и новую, более позднюю версию компоновочного блока) на машине клиента. Как обычно и случается, девять из десяти соответствующих


Игнорирование проверки соответствия правилам ВР 1.1

Из книги Adobe InDesign CS3 автора Завгородний Владимир

Игнорирование проверки соответствия правилам ВР 1.1 В .NET 2.0 Web-сервисы XML автоматически проверяются на соответствие спецификациям базового профиля WSI версии 1.1 (ВР 1.1). В большинстве случаев это хорошо, поскольку позволяет создавать программное обеспечение с самыми


Создание указателя

Из книги Word 2007.Популярный самоучитель автора Краинский И

Создание указателя Предметные (или алфавитные) указатели используются в научной и справочной литературе для быстрого ориентирования читателя в тексте. Специальный раздел в конце книги содержит список тем, изложенных в ней, и страницы, на которых идет речь об этих темах.В


Создание указателя

Из книги Основы AS/400 автора Солтис Фрэнк

Создание указателя Когда набор текста будет завершен и фразы, которые должны присутствовать в указателе, будут в него внесены, можно переходить к созданию указателя. Для этого сделайте следующее.1. Установите курсор в то место текста, куда должен быть вставлен указатель.2.


Удаление элемента из указателя

Из книги Справочник по PHP автора

Удаление элемента из указателя Для удаления элемента из указателя нужно удалить весь текст, помещенный в фигурные скобки. Чтобы текст указателя был виден, нужно включить режим отображения непечатаемых символов при помощи кнопки Отобразить все знаки в группе Абзац


Внутри указателя

Из книги Язык программирования Си для персонального компьютера автора Бочков C. О.

Внутри указателя Указатель используется в AS/400 для доступа к объектам. В этом разделе мы сосредоточимся исключительно на формате разрешенного указателя. У разрешенного указателя две функции: он описывает объект и полномочия пользователя на этот объект; а также задает


Положение указателя текущей позиции

Из книги Linux программирование в примерах автора Роббинс Арнольд

Положение указателя текущей позиции feofУказатель конца файла.Синтаксис:int feof(int $f)Возвращает true, если достигнут конец файла (то есть если указатель файла установлен за концом файла).Пример:$f=fopen("myfile.txt","r");while(!feof($f)){ $str=fgets($f); // Обрабатываем очередную строку


Объявление указателя

Из книги Язык Си - руководство для начинающих автора Прата Стивен

Объявление указателя Указатель — это переменная, предназначенная для хранения адреса объекта некоторого типа. Указатель на функцию содержит адрес точки входа в функцию.Синтаксис:[<спецификация типа]> *<описатель>;Объявление указателя специфицирует имя


10.4.3. Игнорирование сигналов

Из книги Linux и UNIX: программирование в shell. Руководство разработчика. автора Тейнсли Дэвид

10.4.3. Игнорирование сигналов Более практично, когда вызывается обработчик сигнала, это означает, что программа должна завершиться и выйти. Было бы раздражающим, если бы большинство программ по получении SIGINT выводили бы сообщение и продолжали работу; смысл сигнала в том,


10.8.3.1. Плохие родители: полное игнорирование потомков

Из книги C++ для начинающих автора Липпман Стенли

10.8.3.1. Плохие родители: полное игнорирование потомков Простейшим действием, которое вы можете сделать, является изменение действия для SIGCHLD на SIG_IGN. В этом случае завершившиеся потомки не становятся зомби. Вместо этого статус их завершения отбрасывается, и они полностью


Описание и инициализация указателя на структуру

Из книги автора

Описание и инициализация указателя на структуру      Вот самое простое описание, какое только может быть: struct guy *him;Первым стоит ключевое слово struct, затем слово guy, являющееся именем структурного шаблона, далее * и за нею имя указателя. Синтаксис тот же, как для описаний


8.1.8. Игнорирование регистра символов

Из книги автора

8.1.8. Игнорирование регистра символов По умолчанию команда grep чувствительна к изменению регистра символов. Чтобы провести поиск без учета регистра, воспользуйтесь опцией -i. В файле data.f обозначение месяца Sept встречается как в верхнем, так и в нижнем регистре. Поэтому для


18.7.8. Игнорирование символа #

Из книги автора

18.7.8. Игнорирование символа # При просмотре текстовых файлов возникает необходимость игнорировать или пропускать строки комментария. Ниже приводится типичный пример.Предположим, что с помощью обычного цикла while просматривается файл конфигурации. Обычно выполняется


26.3.4. Игнорирование сигналов

Из книги автора

26.3.4. Игнорирование сигналов Когда пользователь регистрируется в системе, просматривается файл /etc/profile; нежелательно, чтобы пользователь прерывал этот процесс. Обычно задается перехват, или игнорирование, сигналов 1, 2, 3 и 15, но потом при просмотре сообщения motd (ежедневного


7.9.1. Тип указателя на функцию

Из книги автора

7.9.1. Тип указателя на функцию Как объявить указатель на функцию? Как выглядит формальный параметр, когда фактическим аргументом является такой указатель? Вот определение функции lexicoCompare(), которая сравнивает две строки лексикографически:#include stringint lexicoCompare( const string sl, const