为什么是
-2
而不是-1
?这是代码的一部分,必须将字符串从一个文件反向写入另一个文件。你能帮我理解为什么是-2
而不是-1
吗?
while ( n >= 0) {
read(fdin, &c, 1);
write(fdout, &c, 1);
n=lseek(fdin,-2,SEEK_CUR);
}
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
循环条件变为假并退出循环。
简单且同时完整地说: _lseek 和 _lseeki64 (这些强大的函数)可以向上和向后移动文件指针。