3.4. High-level interface
此接口提供读取和写入bzip2
格式文件的功能。首先,一些通用的要点。
- 所有函数都采用
int*
型的第一个参数bzerror
。每次调用后,应首先查询bzerror
以确定调用的结果。如果bzerror
为BZ_OK
,则调用成功完成,只有在该情况下才能查询函数的返回值(如果有的话)。如果bzerror
是BZ_IO_ERROR
,则在读取/写入基础压缩文件时出错,然后应查询errno/perrror
以确定出错的原因。bzerror
也可以设置为各种其他值;下面根据每个函数给出了精确的细节: - 如果
bzerror
表示一个错误(即除BZ_OK
和BZ_STREAM_END
之外的任何内容),你应当立刻调用BZ2_bzReadClose
(或者BZ2_bzWriteClose
,这取决于你是尝试读取还是写入)以释放与stream相关联的全部资源。一旦指示错误,除BZ2_bzReadClose
(BZ2_bzWriteClose
)外的所有调用的行为都是undefined。这意味着(1)每次调用后都应当检查bzerror
,(2)如果bzerror
指示一个错误,然后应当调用BZ2_bzReadClose
(BZ2_bzWriteClose
)进行清理。 - 传递给
BZ2_bzReadOpen
/BZ2_bzWriteOpen
的FILE*
参数应该设置为binary模式,大多数Unix系统默认情况下都会这样做,但是其他平台,包含Windows和Mac,不会这样做。如果忽略这一点,在将代码移动到新平台时可能会遇到问题。 - 内存分配请求由malloc/free处理。目前,在文件I/O函数中没有用户定义的内存分配器的功能(尽管可以很容易地添加)。
3.4.1. BZ2_bzReadOpen
typedef void BZFILE;
BZFILE *BZ2_bzReadOpen( int *bzerror, FILE *f,
int verbosity, int small,
void *unused, int nUnused );
准备从文件句柄f
读取压缩数据。f
应当指向一个已打开以供读取的文件,并且未设置错误指示器 (ferror(f)
)。如果参数small
设置为1,库将尝试使用更少的内存来解压缩,代价是牺牲速度。