Часть read
- это та, которая меняет символы.Так как каждый read
из 1 символа перемещает позицию файла вперед на один символ, мы должны вернуться назад 2 символов, чтобы перейти назад.
Предположим, что файл имеет длину всего 2 символа и содержит содержимоеAB
:
AB
В начале части кода, которую вы здесь не показывали, указатель файла располагается за один конец до конца файла, поэтому он указывает на B
.
|
v
AB
Теперь мы читаем один символ - B
читается.Указатель файла на fdin
продвигается до конца файла .
|
v
AB
Если мы будем искать в обратном направлении на один символ, мы окажемся вB
снова.Но если мы будем искать назад 2 символ, он будет указывать на A
:
|
v
AB
И мы в конечном итоге будем читать сначала B
, а затем A
.
Наконец, когда мы пытаемся выполнить поиск за пределами начала файла, lseek
вернет (off_t)-1
, чтобы обозначить условие ошибки, а условие цикла while
станет ложным и цикл завершится.