【问题标题】:Reading a file as binary, compressing and writing it back as binary以二进制形式读取文件,将其压缩并以二进制形式写回
【发布时间】:2020-05-18 06:17:23
【问题描述】:

我们被分配在 C++ 中实现 Shannon Fano 压缩算法。虽然算法不是什么大问题,但我在将给定文件(txt、excel、BMP)作为二进制文件读取以进行压缩时遇到了一些麻烦。

教授。给了我们一些提示,但我不明白它们应该如何使用。他说我们应该制作一个包含文件路径的对象。然后它具有读取位、读取字节、读取整数和从二进制文件中读取浮点数的方法。虽然我知道 readBin 和 readByte 做了什么,但我不明白如何使用 readInt 或 readFloat 方法(fstream 如何知道下一个 char 是 int 或 float)。

有人知道如何使用我上面列出的方法实现二进制读取吗?谢谢!

【问题讨论】:

  • 也许您应该读取几个字节并将它们解释为intfloat?但是,解释您的任务对于 SO 来说是题外话,请向您的教授寻求澄清。请向我们展示您的努力以及您遇到的问题。

标签: c++ algorithm filereader


【解决方案1】:

虽然我知道 readBin 和 readByte 做了什么,但我不明白如何使用 readInt 或 readFloat 方法(fstream 如何知道下一个 char 是 int 或 float)。

嗯,这个应用程序不需要任何这些。你只需要读入所有的二进制数据,压缩它,然后写出压缩的数据。使用解压缩而不是压缩的相同过程将反转该过程。

但要回答您的问题,请按以下步骤操作:

  1. 准确定义每个字节在您的格式中的含义。例如,对于readInt,您可以选择使用四个字节来表示大端格式的有符号四字节整数。

  2. 读取适当数量的字节。因此,对于一个四字节的readInt,您将读取四个字节。可能变成了char *

  3. 根据您的格式将字节解析为您想要返回的任何类型。

  4. 返回该值。

同样,你不需要为你的任务做任何这些。

【讨论】:

    【解决方案2】:

    除非您需要考虑不同文件(BMP、XLSX 等)的内部格式以提高压缩率,否则对于您的用例,我认为除了二进制流之外没有任何特殊理由将它们视为其他文件: 应用压缩算法的一堆字节。

    我建议你看看这个答案,在那里你有一个关于如何在 C++ 中读取二进制文件的非常简单的例子:https://stackoverflow.com/a/16435334/9390121

    在内存中读取文件后,只需将其压缩并将其写回磁盘(即write() 而不是read())。

    【讨论】:

      【解决方案3】:

      不确定是否有必要将整个文件读取为字节,但如果您需要 getInt() 或 getFloat(),请点击此处:

      template<typename T>
      T readType(std::ifstream& ifile){
          T result;
          ifile.read((char*)&result, sizeof(T));
          return result;
      }
      

      使用示例:

      std::ifstream ifile("file.txt", std::ios::binary);
      int i = readType<int>(ifile);
      

      【讨论】:

        猜你喜欢
        • 2020-10-28
        • 1970-01-01
        • 2013-07-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多