【问题标题】:is there a way to fopen a file that allows me to edit just a few bytes?有没有办法打开一个允许我只编辑几个字节的文件?
【发布时间】:2011-12-01 00:37:25
【问题描述】:

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

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

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

【问题讨论】:

    标签: c++ io


    【解决方案1】:

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

    1. fopen(filename, "r+b")打开;
    2. 写入8个字节;
    3. 使用fclose()关闭文件。

    r+ 表示

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

    并且需要b以二进制模式打开。

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

    【讨论】:

      【解决方案2】:

      写出最后几个字节的数据后,使用rewind() 将文件指针带回到文件的开头。然后你可以输出你的 8 个字节的长度信息。

      【讨论】:

      • 对用于写入最后几个字节数据的FILE* 不起作用,因为该文件是为追加而打开的。
      • @steve:追加只是意味着将指针自动移动到文件末尾。它仍然可以写作,所以你可以在任何你想要的地方倒带/寻找。
      • 试试看。追加模式意味着所有写入都到文件末尾,而不管当前的查找位置。
      • 好吧,便便……这不是很傻。哦,好吧,答案仍然成立,只需在常规写入模式下重新打开文件并寻找到 0。
      • 这就是我记得它的原因,因为它不是我所期待的。当我被它抓住时,我正在实施fwrite
      【解决方案3】:

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

      这种格式的缺点是,流的读取器在全部读取之前无法知道有多少数据即将到来。但好处是它避免了你试图解决的这个问题。

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

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

      祝你好运。

      【讨论】:

        猜你喜欢
        • 2013-01-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多