为什么用偏移量为“ -2”而不是“ -1”的lseek进行反向读取?

时间:2018-10-28 16:35:28

标签: c linux posix system-calls lseek

为什么是-2而不是-1?这是代码的一部分,必须将一个字符串从一个文件反向写入另一个文件。您能帮我理解为什么是-2而不是-1吗?

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

1 个答案:

答案 0 :(得分:3)

read部分是反转字符的部分。由于1个字符中的每个read都将文件位置向前移动一个字符,因此我们必须向后 2 个字符后退。

假设文件只有2个字符长,内容为AB

AB

在您未在此处显示的部分代码的开头,文件指针位于文件结尾之前一个指针,因此它指向B

 |
 v
AB

现在,我们读取一个字符-已读取Bfdin上的文件指针前进到文件的结尾

  |
  v
AB

如果我们以一个字符向后搜索,我们将再次以B结尾。但是,如果我们向后寻找 2 字符,它将指向A

|
v
AB

最后我们先阅读B,然后阅读A

最后,当我们尝试查找超出文件开头的位置时,lseek将返回(off_t)-1表示错误条件,并且while循环条件变为false并退出循环。