Почему lseek со смещением `-2`, а не` -1` для чтения в обратном порядке? - PullRequest
0 голосов
/ 28 октября 2018

Почему это -2, а не -1?Это часть кода, которая должна записать строку из файла в другой в обратном порядке.Можете ли вы помочь мне понять, почему это -2, а не -1?

  while ( n >= 0)  {
       read(fdin, &c, 1);
       write(fdout, &c, 1);
       n=lseek(fdin,-2,SEEK_CUR);
  }

1 Ответ

0 голосов
/ 28 октября 2018

Часть 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 станет ложным и цикл завершится.

...