【发布时间】:2018-11-01 11:00:42
【问题描述】:
我在 c++ 中使用 zlib。
引用自
http://refspecs.linuxbase.org/LSB_3.0.0/LSB-PDA/LSB-PDA/zlib-gzwrite-1.html 关于gzwrite 功能:
gzwrite()函数应将数据写入由file引用的压缩文件,该压缩文件应以写入模式打开(请参阅gzopen()和gzdopen())。在进入时,buf应指向包含len字节未压缩数据的缓冲区。gzwrite()函数应压缩此数据并将其写入文件。gzwrite()函数应返回实际写入的未压缩字节数。
我将此解释为返回值不会告诉我写入时文件变大了多少。只有多少数据被压缩到文件中。
知道文件有多大的唯一方法是关闭它,然后从文件系统中读取大小。我要求只继续写入文件,直到它达到一定大小。不关闭文件可以实现吗?
一种解决方法是写入直到未压缩的大小达到我的限制,然后关闭文件,从文件系统读取大小并基于此更新我对文件大小的最佳猜测,然后重新打开文件并继续写入.这将使我在接近尾声时关闭并打开文件几次(因为我接近大小限制)。
另一种解决方法,它会给出更多的估计(这不是我真正想要的)是写入直到未压缩的大小达到限制,关闭文件,从文件系统读取文件大小并计算压缩比至今。我可以使用此压缩比来计算未压缩文件大小的新限制,其中压缩应该使我降低到压缩文件大小的限制。如果我重复这一点,估计会有所改善,但同样不是我想要的。
有更好的选择吗?
如果 zlib 可以在文件仍处于打开状态时告诉我压缩文件的大小,则首选选项。我不明白为什么此时此信息在 zlib 中不可用,因为压缩是在我调用 gzwrite 时发生的,而不是在我关闭文件时发生的。
【问题讨论】:
-
您可以将压缩数据写入管道,然后从该管道读取数据并将其写入实际文件,同时跟踪写入了多少数据
-
你会怎么做?我必须给
gzopen打电话,给我一个gzFile_s*,给定一条路径。我如何将其重定向到管道?