这一切都归结于可视化。
我把文件看作一个以零为基准的数组。即,索引为
0
的字节等等。
对于文件操作,我倾向于将指针看作位于索引之间。它是一种处于中间状态的指示器,预示着未来的期望。这也与
SEEK_END
有关,可以将其视为对未来的期望。
SEEK_END -3
- 现在我可以读取最后3个字节。
SEEK_END 0
- 没有更多字节了。现在我可以追加字节。
- ...
如果
偏移量例如为
4
,那么我知道下一个字节位于索引
4
,上次读取的字节位于索引
3
。
0 1 2 3 4 5 6 7 Offset
+
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | Index
+
| | |
| | +
| +
+
有些人可能觉得这有点尴尬,但对我来说很有效。
至于
SEEK_END
,它的名字已经说明了一切。相对于末尾进行查找。末尾已经全部读取,表示没有剩余内容。而
SEEK_END
和
SEEK_SET
也有直接的关系,如下所示:
SEEK_SET - SIZE = SEEK_END
SEEK_END + SIZE = SEEK_SET
SEEK_SET - SEEK_END = SIZE
SEEK_SET + abs(SEEK_END) = SIZE
在最后的图表中,我们将
OFFSET
和
ORIGIN
作为
seek()
的参数。
(Size: 7 bytes) ,
/
0 1 2 3 4 5 6 | O O | BYTES |
+---+---+---+---+---+---+---+ F R | L | R |
| A | B | C | D | E | F | G | F I | E | E |
+---+---+---+---+---+---+---+ S G | F | A |
| | | | E I | T | D |
| | | | T N . . RELATION
| | | | . . . .
| | | +-- 7, SEEK_SET | 0 | 7 | 7 - 7 = 0
| | | +-+ 0, SEEK_END | 0 | 7 | 0 + 7 = 7
| | | | 7 - -0 = 7
| | | |
| | +-----| 6, SEEK_SET | 1 | 6 | 6 - 7 = -1
| | +-----+ -1, SEEK_END | 1 | 6 | -1 + 7 = 6
| | | 6 - -1 = 7
| | |
| +-------------| 4, SEEK_SET | 3 | 4 | 4 - 7 = -3
| +-------------+ -3, SEEK_END | 3 | 4 | -3 + 7 = 4
| | 4 - -3 = 7
| |
+-----------------------------| 0, SEEK_SET | 7 | 0 | 0 - 7 = -7
+-----------------------------+ -7, SEEK_END | 7 | 0 | -7 + 7 = 0
| | 0 - -7 = 7
fseek(fh, offs, origin) |
/
ftell() -´
SEEK_END
不是要使用负值吗?(只是问问,我不确定) - rodrigo