【问题标题】:Why lseek with offset `-2` and not `-1` to read in reverse?为什么 lseek 使用偏移量 `-2` 而不是 `-1` 来反向读取?
【发布时间】:2019-04-01 16:33:30
【问题描述】:

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

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

【问题讨论】:

    标签: c linux posix system-calls lseek


    【解决方案1】:

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

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

    AB
    

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

     |
     v
    AB
    

    现在我们读取一个字符 - B 被读取。 fdin 上的文件指针前进到文件末尾

      |
      v
    AB
    

    如果我们通过 one 字符向后搜索,我们将再次到达B。但是如果我们向后寻找 2 字符,它将指向A

    |
    v
    AB
    

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

    最后,当我们尝试在文件开头之外寻找时,lseek 将返回 (off_t)-1 以表示错误条件,while 循环条件变为 false 并退出循环。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-28
      • 2011-05-12
      • 1970-01-01
      • 2022-11-27
      相关资源
      最近更新 更多