为什么不将指向文件第一行的指针移动到我们想要的行呢?
因为没有“指向文件第一行的指针”这样的东西。
修改文件的基本操作是:覆盖一定范围的字节(即用相同长度的数据替换一部分)、追加(即在末尾添加)、截断(即从末尾删除)。
大多数文件系统将文件存储在固定大小的块中,除了最后一个块可能是部分的。如果修改会改变被修改内容的大小,则无法在适当的位置修改数据,除非更改在最后或者修改会将数据移动整个块数。按整数个块移动数据只能是巧合,并且没有广泛的接口¹来做到这一点。
删除文件开头数据的最有效方法是将需要保留的数据复制到新文件中。这正是做什么tail -n +42或sed '41,$p'做什么。
¹现代 Linux 系统有一个系统调用来删除文件的一部分:fallocate(fd, FALLOC_FL_COLLAPSE_RANGE, …),您可以通过实用程序调用它fallocate --collapse-range=…。还有FALLOC_FL_INSERT_RANGE和--insert-range。但是它们仅限于块,这使得它们对于文本文件大多无用,并且它们不适用于所有文件系统。