我正在编写一个使用zlib流压缩二进制数据的类。我有一个用输出流填充的缓冲区,一旦它变满了,我就用fopen(filename, 'ab');...将缓冲区转储到一个文件,这意味着我的程序只有在有一个满是要转储的数据的缓冲区时才会打开文件进行写入,它会打开并立即关闭它。
问题是在我的格式中,我在每个文件的开头使用一个8字节的标题,其中包含原始长度和压缩长度,但直到整个压缩过程结束时我才知道这些值。
我想要做的是写入8个字节的零,然后附加我所有的压缩数据,然后在清理过程中返回到最后,用大小数据填充这8个字节,但我似乎找不到一种打开文件的方法,而不是将它全部带回内存中。我只想编辑文件的前8个字节。我需要使用mmap吗?
发布于 2011-12-01 00:11:01
由于您在append模式下使用该文件,因此需要关闭并重新打开它:
使用fopen(filename, "r+b");
fclose().关闭
r+的意思是
打开以进行读取和写入。流位于文件的开头。
并且b需要以二进制模式打开。
您可以使用此方法更改文件中任何位置的数据,而不仅仅是开头的位置:只需在写入之前使用fseek()查找到所需的位置。
发布于 2011-12-01 00:10:42
在写出最后几个字节的数据后,使用rewind()将文件指针返回到文件的开头。然后你可以输出8个字节的长度信息。
发布于 2011-12-01 00:37:26
如果您可以灵活地更改格式,我可能会建议您这样做。定义压缩流,使其是未知数量的块的序列,并且每个块前面有一个固定长度的整数,该整数指定块中的字节数。当下一个块的大小为零时,流就结束了。
这种格式的缺点是,在读取完所有数据之前,流的读取器无法知道有多少数据正在到来。但好处是,它避免了您试图解决的问题。
更重要的是,它允许您在读取输入时将压缩的数据流发送到某个地方,而不必在发送之前将其全部保存。例如,您可以编写一个可以放入管道流中的压缩Unix筛选器:
prog1 | yourprog -compress | rsh host yourprog -expand | prog2祝好运。
https://stackoverflow.com/questions/8329062
复制相似问题