Linux программирование в примерах | страница 84



, программа продолжит работу, и >myfile будет расти до тех пор, пока вы не прервете ее. GNU версия >cat осуществляет эту проверку. Обратите внимание, что что-то вроде этого выходит за рамки контроля >cat:

>$ v7cat < myfile > myfile

>cat: input - is output

>$ ls -l myfile

>-rw-r--r-- 1 arnold devel 0 Mar 24 14:17 myfile

В данном случае это слишком поздно, поскольку оболочка урезала файл >myfile (посредством оператора >>) еще до того, как >cat получила возможность исследовать файл! В разделе 5.4.4.2 «Возвращаясь к V7 cat» мы объясним код с >struct stat.

4.5. Произвольный доступ: перемещения внутри файла

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

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

>#include /* для off_t; POSIX */

>#include /* объявления lseek() и значений whence */


>off_t lseek(int fd, off_t offset, int whence);

Тип >off_t (тип смещения) является знаковым целым, представляющим позиции байтов (смещений от начала) внутри файла. На 32-разрядных системах тип представлен обычно как >long. Однако, многие современные системы допускают очень большие файлы, в этом случае >off_t может быть более необычным типом, таким, как C99 >int64_t или какой-нибудь другой расширенный тип. >lseek() принимает три следующих аргумента.

>int fd

Дескриптор открытого файла.

>off_t offset

Позиция, в которую нужно переместиться. Интерпретация этого значения зависит от параметра >whence. >offset может быть положительным или отрицательным; отрицательные значения перемещают к началу файла; положительные значения перемещают к концу файла.

>int whence

Описывает положение в файле, относительно которого отсчитывается >offset. См. табл. 4.4.


Таблица 4.4. Значения >whence для >lseek()

Именованная константаЗначениеКомментарий
>SEEK_SET0>offset абсолютно, т.е. относительно начала файла
>SEEK_CUR1>offset относительно текущей позиции в файле
>SEEK_END2>offset относительно конца файла.

Большое количество старого кода использует числовые значения, приведенные в табл. 4.4. Однако, любой новый код, который вы пишете, должен использовать символические имена, значение которых более ясно.