2009-04-22 5 views
2

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

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

+0

Это несчастливо, такого рода реализация была бы неплохо использовать ... – jokoon

ответ

2

Try:

#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; 
} 
+0

не уверен, что я понимаю ... что такое «маска»? Почему вы создаете битовый набор const, а затем другой с тем же именем? –

+0

Обновлен мой ответ, взгляните! Это были артефакты из быстрых изменений примера битов SGI. – dirkgently

+0

Хорошо, отлично. Работает с оператором потока <<, но не fstream.write() ... проверьте. –

0

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

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