Как записать битовое поле в двоичный файл - PullRequest
0 голосов
/ 21 июня 2019

Допустим, у меня есть битовое поле, которое составляет 32 бита.Я хочу вывести их в двоичный файл, давайте назовем его «binary.bin».Как мне сделать это без сбоев Visual Studio?

Я нашел так мало информации о подобных вещах из предыдущих поисков в Google, что я понятия не имею, что делать.Обычный ответ: «никто не использует битовые поля lmao», но оказывается, что мне нужно использовать битовые поля для работы.

Я понимаю, что битовые поля иногда меньше 8 бит, что делает невозможным размещение в байте, что делает егос этим трудно работать, но это не значит, что я не могу взять 32-битное битовое поле и поместить его в двоичный файл, верно?

Я нашел информацию о печати в двоичный файл в другом месте, надеюсь.это работает.

struct bitfield {

    unsigned int     b1 : 22; 
    unsigned int     b2 : 4;
    unsigned int     b3 : 5;
    unsigned int     b4 : 1; 
};
int main(){

    std::ofstream ofile("binary.bin", std::ios::binary);
    ofile.write((char*)&bitfield.b1, sizeof(unsigned int));

    return 0;
}

Это даже не работает, и я не знаю почему, мне не нравится, когда я говорю bitfield.b1

Буду признателен за любую помощьты можешь бросить в меня ?

Ответы [ 2 ]

1 голос
/ 21 июня 2019

Я заметил две проблемы в вашем опубликованном коде.

Задача 1.

Вам нужен объект для сохранения его содержимого в файл, а не тип и его член.

Выражение bitfield.b1 неверно с этой точки зрения. Вам нужно:

bitfield obj;

После этого вы можете использовать obj.b1 для ссылки на участника.

Задача 2:

Язык не позволяет вам получить адрес члена битового поля. См. Существуют ли переменные, адрес которых не может быть получен?


Решение

Создайте объект и сохраните весь объект в файл, а не просто битовое поле.

std::ofstream ofile("binary.bin", std::ios::binary);
bitfield obj;
ofile.write(retinterpret_cast<char*>(&obj), sizeof(obj));
0 голосов
/ 21 июня 2019

Сначала вам нужно объявить переменную типа bitfield, а не просто структуру с именем bitfield.Для записи в двоичный файл:

bitfield bf;
... some value sett
FILE *f=fopen("binary.bin","wb");
fwrite(&bf,sizeof(bf),1,f);
fclose(f);
...