Если вы ищете отрицательное смещение от начала файла, вы получаете ошибку - нет доступных байтов до начала файла.
Кроме того, вы всегда должны проверять или фиксировать результаты системных вызовов, а не полагаться на установленную errno
. Библиотека C никогда не устанавливает errno
на ноль (кроме случаев, когда процесс / поток запускается). Может быть установлено ненулевое значение, даже если функция выполнена успешно. В Solaris обычно устанавливается errno
после записи в файл, поскольку файл не является терминалом, а библиотека пытается выполнить операцию, которая завершается успешно только на терминале.
Рабочий код, за вычетом выделения памяти через 'malloc ()'. Он явно печатает только количество прочитанных символов («<<%.*s>>
» ограничивает длину указанным размером; угловые скобки облегчают просмотр данных, которые печатаются).
#include <unistd.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
char c[100];
int fd, sz, i;
fd = open("input.in", O_RDONLY);
if (fd < 0)
{
perror("Error from open(\"input.in\", O_RDONLY)");
exit(1);
}
sz = read(fd, c, 10);
printf("Opened input.in (fd = %d)\n", fd);
printf("We called read(fd, c, 10) and read %d bytes: <<%.*s>>\n",
sz, sz, c);
i = lseek(fd, 0, SEEK_CUR);
printf("lseek(fd, 0, SEEK_CUR) returns the current offset of %d\n", i);
printf("We seek to start of the file and call read(fd, c, 10)\n");
i = lseek(fd, 0, SEEK_SET);
if (i != 0)
perror("Error from lseek(fd, 0, SEEK_SET)\n");
sz = read(fd, c, 10);
if (sz < 0)
perror("Error from read(fd, c, 10)\n");
printf("We read the following bytes: <<%.*s>>\n", sz, c);
printf("We now execute lseek(fd, -6, SEEK_END) which returns %d\n",
(int) lseek(fd, -6, SEEK_END));
printf("Executing read(fd, c, 10), we get the following bytes: ");
sz = read(fd, c, 10);
if (sz < 0)
perror("Error from read(fd, c, 10)\n");
printf("<<%.*s>>\n", sz, c);
printf("Finally, we execute lseek(fd, -1, SEEK_SET) which returns -1\n");
fflush(stdout);
if ((i = lseek(fd, -1, SEEK_SET)) < 0)
perror("Error from lseek(fd, -1, SEEK_SET)");
printf("i = %d\n", i);
return 0;
}
Выход:
Opened input.in (fd = 3)
We called read(fd, c, 10) and read 10 bytes: <<Jim Plank
>>
lseek(fd, 0, SEEK_CUR) returns the current offset of 10
We seek to start of the file and call read(fd, c, 10)
We read the following bytes: <<Jim Plank
>>
We now execute lseek(fd, -6, SEEK_END) which returns 16
Executing read(fd, c, 10), we get the following bytes: <<n 221
>>
Finally, we execute lseek(fd, -1, SEEK_SET) which returns -1
Error from lseek(fd, -1, SEEK_SET): Invalid argument
i = -1