以二进制形式读取文件,压缩并以二进制形式写回 我们已经给出了在C++中实现Shannon Fanno压缩算法的任务。虽然算法没有太大问题,但我在将给定文件(txt、excel、BMP)作为二进制文件进行压缩时遇到了一些问题

以二进制形式读取文件,压缩并以二进制形式写回 我们已经给出了在C++中实现Shannon Fanno压缩算法的任务。虽然算法没有太大问题,但我在将给定文件(txt、excel、BMP)作为二进制文件进行压缩时遇到了一些问题,c++,algorithm,filereader,C++,Algorithm,Filereader,教授给了我们一些提示,但我不知道应该如何使用它们。他说我们应该创建一个对象,该对象接受文件的路径。然后它有从二进制文件读取位、字节、整数和浮点的方法。虽然我知道readBin和readByte的作用,但我不明白如何使用readInt或readFloat方法(fstream如何知道下一个字符是int或float) 有人知道如何用上面列出的方法实现二进制读取吗?谢谢 除非您需要考虑不同文件(BMP、XLSX等)的内部格式以改进压缩,否则对于您的用例,我认为没有任何特殊理由将它们视为二进制流以外的任何

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


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

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

我建议您看看这个答案,这里有一个关于如何在C++中读取二进制文件的非常简单的示例:


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

除非需要考虑不同文件(BMP、XLSX等)的内部格式以改进压缩,对于您的用例,我不认为有任何特殊的理由将它们视为二进制流以外的任何东西:应用压缩算法的一组字节

我建议您看看这个答案,这里有一个关于如何在C++中读取二进制文件的非常简单的示例:

一旦在内存中读取了文件,就需要压缩文件并将其写回磁盘(即
write()
而不是
read()

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

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

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

  • 精确定义每个字节在格式中的含义。例如,对于
    readInt
    ,您可以选择使用四个字节以big-endian格式表示有符号四字节整数

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

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

  • 返回该值

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

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

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

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

  • 精确定义每个字节在格式中的含义。例如,对于
    readInt
    ,您可以选择使用四个字节以big-endian格式表示有符号四字节整数

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

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

  • 返回该值


  • 同样,您不需要为您的作业执行任何操作。

    不确定是否有必要不只是将整个文件读取为字节,而是需要getInt()或getFloat(),此处:

    模板
    T读取类型(标准::ifstream和ifile){
    T结果;
    ifile.read((char*)和result,sizeof(T));
    返回结果;
    }
    
    示例用法:

    std::ifstream ifile("file.txt", std::ios::binary);
    int i = readType<int>(ifile);
    
    std::ifstream ifile(“file.txt”,std::ios::binary);
    int i=读取类型(ifile);
    
    不确定是否需要将整个文件读取为字节,但如果需要getInt()或getFloat(),请参见:

    模板
    T读取类型(标准::ifstream和ifile){
    T结果;
    ifile.read((char*)和result,sizeof(T));
    返回结果;
    }
    
    示例用法:

    std::ifstream ifile("file.txt", std::ios::binary);
    int i = readType<int>(ifile);
    
    std::ifstream ifile(“file.txt”,std::ios::binary);
    int i=读取类型(ifile);
    
    也许您应该读取几个字节,并将它们解释为
    int
    float
    ?然而,解释你的任务是离题的,所以,请要求你的教授澄清。请告诉我们您的努力和遇到的困难。也许您应该读取几个字节并将它们解释为
    int
    float
    ?然而,解释你的任务是离题的,所以,请要求你的教授澄清。请告诉我们你的努力和你被困的地方。