2017-12-21 34 views
0

私は、書き込みしようとしているcharに依存して、通常8ビット(char)の代わりに1または2ビットしか書き込まないような圧縮プログラムを作ろうとしています。私は次のように書こうとしました:ビンファイルにシングルビットを書き込む方法

//I dont know what the function should return 
char getBytes(char c) 
{ 
    return 0xff; 
} 

ofstream fout; 
fout.open("file.bin", ios::binary | ios::out); 
fout << getBytes(c); 

しかしこれまでは文字のみを書きました。 どのように書くことができますか: '01'?または '1'のみ?どのような関数で私はバイトだけのファイルへの書き込みに使用する必要がありますか?ありがとう。

+3

特定のビットを書き込む必要がある場合は、それらを1バイトにバッファリングし、8ビットでいっぱいになったらバイトを書き込む必要があります。 – Joe

+2

ビットを書き込む*バイト*オフセットに移動し、既存のバイトを変更し、そのビットと希望のビットを変更して、同じ位置にバイトを書き戻します。 –

答えて

1

ストリームはバイトのシーケンスです。個々のビットを書き込むための標準インタフェースはありません。個々のビットを書きたい場合は、ストリームの先頭にというビットストリームの独自の抽象化を作成する必要があります。これは、複数のビットを1つのバイトに集約し、その後、基本となるストリームに書き込まれます。合理的な効率的な書き込みが必要な場合は、ストリームに書き込む前に複数のバイトを集計する必要があるでしょう。

ナイーブな実装は次のようになります:この実装は最後のバイトのためではなく、基本的な取り扱いを持っていることを

class bitstream { 
    std::streambuf* sbuf; 
    int    count = 0; 
    unsigned char byte = 0; 
public: 
    bitstream(std::ostream& out): sbuf(out.rdbuf()) {} 
    ~bitstream() { 
     if (this->count) { 
      this->sbuf->sputc(this->byte); 
     } 
    } 
    bitstream& operator<< (bool b) { 
     this->byte = (this->byte << 1) | b; 
     if (++this->count == 8) { 
      this->sbuf->sputc(this->byte); 
      this->count = 0; 
     } 
     return *this; 
    } 
}; 

注:バイトが開始された場合には、そのまま書き込まれます。それが意図された動作であるか、最後のバイトの最上位ビットに書かれたビットのためにシフトされる必要があるかどうかは、どのように物事が使用されているかに依存する。また、基になるストリームを書き込めない場合のエラー処理もありません。 (およびコードは未テストです - 私は私の携帯電話でコンパイルするための簡単な方法を持っていない)

あなたは、このようなクラスの何かを使用したい:私は物事を台無しない限り

int main() { 
    std::ofstream file(“bits.txt”, std::ios_base::binary); 
    bitstream  out(file); 

    out << false << true << false << false 
     << false << false << false << true; 
} 

を、上記のコードは、ファイルbits.txtAのASCIIコードは65)にAを書き込む必要があります。

コンテキストの場合:ファイルは実際にはバイトのブロックに編成されます。しかし、ストリーム抽象化は、ブロックに書き込まれた個々のバイトを集約します。バイト指向のインターフェースは一般的なすべてのオペレーティングシステムによって提供されていますが、データのブロックだけではなく、むしろ非効率的な傾向があります。

+0

ありがとう、私はちょうどビットストリームクラスの新しいショーを作成する必要がありますし、何?私は彼にすべてのバイトを挿入する必要があり、バッファが 'フル'(8ビット)のときはファイルにビットストリームを書き込みますか?どのように私は彼女を挿入するのですか?申し訳ありません、私はちょうどcppで新しく、imは 'sbuf(out.rdbuf())'のようなコマンドを完全に理解していません。あなたは本当の助けになります! –

+0

は8ビットをcharに変換する方法ですか?それはより簡単になります –

+0

@マークグリーン:私は混乱しています - 私はあなたの目的が 'char'sではなくビットを書くことだと思った? 'ビットストリーム'の目的はそれを提供することです。 –

関連する問題