Как записать битовые данные в файл?

У меня есть std::bitset, который я хотел бы записать в файл, бит за битом, но, конечно, функция записи fstream не поддерживает это. Я не могу придумать другого способа, кроме преобразования каждой 8-битной группы в char с использованием строки и написания этого...

Кто-нибудь знает хороший способ?


person Tony R    schedule 22.04.2009    source источник
comment
к сожалению, такую ​​реализацию было бы неплохо использовать...   -  person jokoon    schedule 04.01.2011


Ответы (2)


Пытаться:

#include <bitset>
#include <fstream>

int main() {
    using namespace std;
    const bitset<12> x(2730ul); 
    cout << "x =      " << x << endl;

    ofstream ofs("C:\\test.txt"); // write as txt
    if (ofs) {
        // easy way, use the stream insertion operator
        ofs << x << endl;

        // using fstream::write()
        string s = x.to_string();
        ofs.write(s.c_str(), s.length()); 
    }
    return 0;
}
person dirkgently    schedule 22.04.2009
comment
не уверен, что понял... что такое "маска"? Почему вы создаете набор битов const, а затем другой с тем же именем? - person Tony R; 22.04.2009
comment
Обновил мой ответ, посмотрите! Это были артефакты от быстрого редактирования примера набора битов SGI. - person dirkgently; 22.04.2009
comment
Хорошо, отлично. Работает с оператором ofstream‹‹, но не с fstream.write()... проверьте. - person Tony R; 22.04.2009
comment
Также добавлен пример fstream::write(). - person dirkgently; 22.04.2009
comment
Вы можете сэкономить 87,5% пространства, упаковав группы из 8 бит в байт и записав вывод как двоичный. - person moinudin; 22.04.2009

Что ж, "способ" сделать это - использовать строку в качестве метода сериализации. Существует конструктор набора битов, принимающий строковый аргумент, и функция-член to_string(), которая возвращает его. Существуют также вспомогательные операторы ‹‹ и >>, которые используют конструктор и функцию to_string() для вставки и извлечения потока. Это может работать для вас в зависимости от ваших требований.

Это было недостаточно компактно для нас в одном приложении, поэтому в итоге мы написали класс, который выглядит как набор битов (имеет тот же интерфейс), но также сериализуем как поток байтов, что означает, что он имеет функции, которые возвращают указатели на базовый класс. байтовый массив, из которого он состоит. Это было не так уж сложно написать, если у вас есть исходный код для нескольких реализаций, на которые можно посмотреть.

person Brian Neal    schedule 22.04.2009