[英]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)。
好吧,这个应用程序不需要任何这些。 你只需要读入所有的二进制数据,压缩它,然后写出压缩后的数据。 使用解压缩而不是压缩的相同过程将反转该过程。
但是要回答您的问题,请执行以下步骤:
精确定义每个字节在您的格式中的含义。 例如,对于readInt
,您可以选择使用四个字节来表示大端格式的有符号四字节 integer。
读取适当数量的字节。 因此,对于一个四字节的readInt
,您将读取四个字节。 可能变成一个char *
。
根据您的格式将字节解析为您想要返回的任何类型。
返回该值。
同样,你不需要为你的任务做任何这些。
不确定是否有必要将整个文件读取为字节,但如果您需要 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.