当我使用 zlib pushgunzip 逐行读取一个大的 gzip 文件时,tell 函数总是返回 -1 而不是当前访问位置。 有没有办法在逐行读取 gzip 文件时获取访问位置?
set fp [open "foo.gz" r]
zlib push gunzip $fp
while {![eof $fp]} {
set line [gets $fp]
set idx [tell $fp]
puts $idx
}
$idx 始终为 -1
没有一种有效的方法来生成未压缩索引、相关压缩索引和此时解压缩器状态之间的关系,甚至在每千字节的基础上也是如此。是的,解压缩器知道压缩数据的偏移量,但这并不对应于未压缩的索引(这一点是一个压缩字节可以是许多未压缩的字节),并且如果没有解压缩器统计信息,您无论如何都无法
seek
。 (tell
实际上始终只是一个相对偏移量为零的 seek
。)我们可以 seek
到任意位置的唯一方法是倒带到开头,然后从流中读取数据直到我们走得足够远,而做 seek
的目的通常是为了避免这种情况。
简而言之,实现gunzip支持的通道过滤器根本不提供对
seek
(以及tell
作为其特例)的任何支持,并且没有明确的方法来编写这样的实现而不需要它太贵了。