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
>#include
>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_SET | 0 | >offset абсолютно, т.е. относительно начала файла |
>SEEK_CUR | 1 | >offset относительно текущей позиции в файле |
>SEEK_END | 2 | >offset относительно конца файла. |
Большое количество старого кода использует числовые значения, приведенные в табл. 4.4. Однако, любой новый код, который вы пишете, должен использовать символические имена, значение которых более ясно.