Установить текущую позицию в файле на уровне ОС
#include <sys/types.h>#include <unistd.h>off_t lseek( int filedes,off_t offset,int whence );off64_t lseek64( int filedes,off64_t offset,int whence );
<unistd.h>
): libc
Эти функции устанавливают текущую позицию файла для дескриптора файла, указанного filedes на уровне операционной системы. Дескрипторы файлов возвращаются при успешном выполнении одной из функций creat(), dup(), dup2(), fcntl(), open() или sopen().
Ошибка возникает, если запрошенная позиция файла перед началом файла.
Если запрошенная позиция файла находится за пределами конца файла и данные записываются в этот момент, последующие чтения данных в образованном промежутке будут возвращать байты, значение которых равно нулю ('\0') до тех пор, пока данные не будут фактически записаны в образованный промежуток.
Эти функции не увеличивают размер файла (см. chsize()).
Текущая позиция в файле, где 0
указывает начало файла.
Если возникла ошибка функция возвращает -1
, код ошибки записывается в errno.
off_t
. Используя функцию lseek(), можно получить текущую позицию файла (фактически, функция tell() реализована именно таким образом). Затем можно использовать это значение с другим вызовом lseek() для сброса позиции файла:
off_t file_posn;int filedes;/* get current file position */file_posn = lseek( filedes, 0L, SEEK_CUR );.../* return to previous file position */file_posn = lseek( filedes, file_posn, SEEK_SET );
Если все записи в файле имеют одинаковый размер, положение n-й записи можно вычислить и прочитать следующим образом:
#include <sys/types.h>#include <unistd.h>int read_record( int filedes, long rec_numb,int rec_size, char *buffer ){if ( lseek( filedes, rec_numb * rec_size, SEEK_SET ) == -1L ){return (-1);}return (read( filedes, buffer, rec_size ));}
Функция read_record() в этом примере предполагает, что записи нумеруются, начиная с нуля, и что rec_size содержит размер записи в файле, включая любые символы-разделители записей.
lseek() — POSIX 1003.1; lseek64() — Поддержка больших файлов
chsize(), close(), creat(), dup(), dup2(), eof(), errno, execl(), execle(), execlp(), execlpe(), execv(), execve(), execvp(), execvpe(), fcntl(), fileno(), fstat(), isatty(), open(), read(), sopen(), stat(), tell(), umask(), write()
Предыдущий раздел: Описание API системной библиотеки