C++ 有没有办法打开一个只允许我编辑几个字节的文件?

C++ 有没有办法打开一个只允许我编辑几个字节的文件?,c++,io,C++,Io,我正在编写一个使用zlib流压缩二进制数据的类。我有一个用输出流填充的缓冲区,一旦它满了,我就使用fopen(filename,'ab');,将缓冲区转储到一个文件中这意味着,我的程序只会在有一个装满数据的缓冲区要转储时打开要写入的文件,然后执行并立即关闭它 问题是在我的格式中,我在每个文件的开头使用一个8字节的头,其中包含原始长度和压缩长度,但直到整个压缩过程结束,我才知道这些值 我想做的是写8个字节的零,然后附加所有压缩数据,然后在清理过程结束时返回,用大小数据填充这8个字节,但我似乎找不到

我正在编写一个使用zlib流压缩二进制数据的类。我有一个用输出流填充的缓冲区,一旦它满了,我就使用
fopen(filename,'ab');,将缓冲区转储到一个文件中这意味着,我的程序只会在有一个装满数据的缓冲区要转储时打开要写入的文件,然后执行并立即关闭它

问题是在我的格式中,我在每个文件的开头使用一个8字节的头,其中包含原始长度和压缩长度,但直到整个压缩过程结束,我才知道这些值


我想做的是写8个字节的零,然后附加所有压缩数据,然后在清理过程结束时返回,用大小数据填充这8个字节,但我似乎找不到一种方法来打开文件,而不将其全部放回内存。我只想编辑文件的前8个字节。我是否需要使用
mmap

用于在写出最后几个字节的数据后,将文件指针移回文件的开头。然后,您可以输出8字节的长度信息。

由于您在附加模式下使用该文件,您确实需要关闭并重新打开它:

  • fopen打开(文件名为“r+b”)
  • 写入8个字节
  • 使用
    fclose()
    关闭文件
  • r+
    表示

    开放阅读和写作。该流位于 文件的开头

    需要以二进制模式打开
    b


    您可以使用此方法更改文件中任何位置的数据,而不仅仅是在开始时:只需在写入之前使用
    fseek()
    查找所需位置。

    如果您可以灵活更改格式,我可能会建议您这样做。定义压缩流,使其成为未知块数的序列,每个块前面都有一个固定长度的整数,指定块中的字节数。当下一个块的大小为零时,流结束

    这种格式的缺点是,在所有数据都被读取之前,流的读取器无法知道有多少数据正在到来。但优点是它避免了您试图解决的这个问题

    更重要的是,它允许您在读取输入时将压缩的数据流发送到某个地方,而不必在发送之前将其全部保存。例如,您可以编写一个压缩Unix筛选器,将其放入管道流中:

    prog1 | yourprog -compress | rsh host yourprog -expand | prog2
    

    祝你好运。

    无法处理用于写入最后几个字节数据的
    文件*
    ,因为该文件是为追加而打开的。@steve:append只是指自动将指针移到文件末尾。它仍然对写作开放,所以你可以倒带/寻找你想要的任何地方。试试看。追加模式意味着所有写操作都会在文件末尾,而不管当前的搜索位置如何。这不是很傻吗。哦,答案仍然有效,只需在常规写入模式下重新打开文件并搜索到0。这就是为什么我记得它,因为它不是我所期望的。当我被它抓住的时候,我正在实现
    fwrite