在 TCL 中使用 Tell 和 gzip 文件

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

当我使用 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

tcl gzip tell
1个回答
0
投票

没有一种有效的方法来生成未压缩索引、相关压缩索引和此时解压缩器状态之间的关系,甚至在每千字节的基础上也是如此。是的,解压缩器知道压缩数据的偏移量,但这并不对应于未压缩的索引(这一点是一个压缩字节可以是许多未压缩的字节),并且如果没有解压缩器统计信息,您无论如何都无法

seek
。 (
tell
实际上始终只是一个相对偏移量为零的
seek
。)我们可以
seek
到任意位置的唯一方法是倒带到开头,然后从流中读取数据直到我们走得足够远,而做
seek
的目的通常是为了避免这种情况。

简而言之,实现gunzip支持的通道过滤器根本不提供对

seek
(以及
tell
作为其特例)的任何支持,并且没有明确的方法来编写这样的实现而不需要它太贵了。

© www.soinside.com 2019 - 2024. All rights reserved.