ifstream inStream;
inStream.open(filename.c_str(), fstream::binary);
if(inStream.fail()){
cout<<" Error in opening file: "<<filename;
exit(1);
}
假设我们只想处理文件中的各个位。我知道我们可以逐个字符地读取文件,但是我们可以像这样轻松地一点一点地读取它吗?
ifstream inStream;
inStream.open(filename.c_str(), fstream::binary);
if(inStream.fail()){
cout<<" Error in opening file: "<<filename;
exit(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.
您可以使用读取的位来降低霍夫曼树,直到到达叶节点,此时您已经解码了一个符号。
根据您对位的操作,使用 32 位字而不是字节可能更容易读取。在任何一种情况下,您都将进行掩码和移位操作,其细节留给读者作为众所周知的练习。:-) 如果需要多次尝试,请不要气馁;我必须经常适度地做这种事情,但我第一次还是经常出错。