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

问题描述 投票:0回答:2

为什么是

-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
2个回答
4
投票

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

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

AB
:

AB

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

B

 |
 v
AB

现在我们读取一个字符 -

B
被读取。
fdin
上的文件指针前进至 文件末尾

  |
  v
AB

如果我们向后查找一个字符,我们将再次到达

B
。但如果我们向后查找 2 字符,它将指向
A
:

|
v
AB

我们最终会先阅读

B
,然后
A

最后,当我们尝试在文件开头之外查找时,

lseek
将返回
(off_t)-1
以表示错误条件,并且
while
循环条件变为假并退出循环。


0
投票

简单且同时完整地说: _lseek 和 _lseeki64 (这些强大的函数)可以向上和向后移动文件指针。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.