繁体   English   中英

以二进制形式读取文件,将其压缩并以二进制形式写回

[英]Reading a file as binary, compressing and writing it back as binary

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

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

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

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

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

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

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

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

但是要回答您的问题,请执行以下步骤:

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

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

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

  4. 返回该值。

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

不确定是否有必要将整个文件读取为字节,但如果您需要 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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM