ifstream inStream;
inStream.open(filename.c_str(), fstream::binary);
if(inStream.fail()){
cout<<" Error in opening file: "<<filename;
exit(1);
}
ファイルの個々のビットを処理したいとします。ファイルをcharごとに読み取ることができることは知っていますが、少しずつ簡単に読み取ることができますか?
ifstream inStream;
inStream.open(filename.c_str(), fstream::binary);
if(inStream.fail()){
cout<<" Error in opening file: "<<filename;
exit(1);
}
ファイルの個々のビットを処理したいとします。ファイルをcharごとに読み取ることができることは知っていますが、少しずつ簡単に読み取ることができますか?
ファイルは通常、ビットより大きい単位(通常は1バイト以上)で読み取られます。1ビットファイルでも少なくとも1バイトかかります(実際には、ファイルシステムに基づいてディスク上で複数バイトかかりますが、長さはバイト単位で決定できます)。
ただし、ストリームの周りにラッパーを記述して、毎回次のビットを提供し、内部で文字を読み取り、要求されたときにビットを提供し、要求が満たされなくなったときにファイルから次の文字を読み取ることができます。前の文字。1バイト(またはchar)をビットシーケンスに変換する方法を知っていると思います。
これは宿題なので、既存のライブラリを使用する代わりに、自分で作成する必要があります。
ファイルからバイトごとに読み取り、読み取ったバイトから必要に応じてビットを抽出する必要があります。ビットレベルで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 ビット ワード単位で読み取る方が簡単な場合があります。どちらの場合でも、マスク操作とシフト操作を行うことになりますが、その詳細は、読者のことわざの課題として残されています。:-) 何回か試してみてもがっかりしないでください。私はこの種のことを適度に頻繁に行わなければなりませんが、それでも最初は間違いを犯すことがよくあります.