如何处理文件中的位?

时间:2010-03-02 17:49:46

标签: c++ input huffman-code

ifstream inStream;
inStream.open(filename.c_str(), fstream::binary);
if(inStream.fail()){
   cout<<" Error in opening file: "<<filename;
   exit(1);
}

假设我们只想处理文件中的各个位。我知道我们可以通过char读取char文件,但是我们可以一点一点地读取它吗?

3 个答案:

答案 0 :(得分:1)

文件通常以大于一位(通常是一个字节或更高)的单位读取。单个位文件仍然至少需要整个字节(实际上,它将基于文件系统在磁盘上占用多个字节,但长度可以以字节为单位确定)。

但是,您可以在流中编写一个包装器,每次都提供下一位,同时在内部读取一个字符,在被要求时提供位,并在有一个不再需要的请求时从文件中读取下一个字符从前一个角色填充。我假设您知道如何将单个字节(或字符)转换为位序列。

由于这是家庭作业,您可能希望自己编写,而不是使用现有的 图书馆。

答案 1 :(得分:1)

您必须逐字节读取文件,然后根据需要从读取字节中提取位。没有办法在位级别执行IO。

我猜你的二进制文件是霍夫曼编码和压缩文件。您必须逐字节读取此文件,然后使用按位运算符从这些字节中提取位:

char byte;
// read byte from file.
unsigned char mask = 0x80; // mask for bit extraction.
byte & mask // will give you the most significant bit.
byte <<= 1; // will left sift the byte by 1 so that you can read the next MSB.

你可以使用读取位来下降霍夫曼树,直到你到达叶子节点,此时你已经解码了一个符号。

答案 2 :(得分:0)

根据您对这些位的处理,可能更容易通过32位字而不是字节读取。在任何一种情况下,你都将进行面具和轮班操作,其具体细节留给读者作为众所周知的练习。 :-)如果需要多次尝试,请不要气馁;我必须经常适度地做这种事情,而且我第一次经常犯错误。