Bitset неправильно извлекает биты

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

void loader::load_inode_map(string filename){
    FILE *fp = fopen(filename.c_str(), "rb+");
    fseek(fp, sb.block_size, SEEK_SET);
    bitset<8> bit;
    char c;

    int count = 0;
    for(int i = 0; i < 32; i++){
        fread(&c, 1, 1, fp);
        bit = c;
        cout << "---new byte---" << endl;
        for (int j = 7; j >= 0; j--){
            cout << bit[j] << endl;
            inode_map[count] = bit[j];
            count++;
        }
    }
    fclose(fp);
}

Чтобы проверить функциональность этой функции, я установил все биты в 1. Это распечатывается для первого байта, но все байты послесловия печатаются только 0. Что я делаю не так?

Output:
---new byte---
1
1
1
1
1
1
1
1
---new byte---
0
0
0
0
0
0
0
0
---new byte---
0
0
0
0
0
0
0
0
...and so on.

Так что я почти уверен, что вы используете C++ из-за класса и строки; и cout. Но тогда что это за шутка?

UKMonkey 02.05.2018 16:24

Мы понятия не имеем, что находится в том файле, который вы читаете. Как насчет того, чтобы пропустить чтение файла ради этого вопроса и просто жестко закодировать значения в каком-то массиве, чтобы убедиться, что битовый набор «не работает должным образом».

PaulMcKenzie 02.05.2018 16:29

А в чем ценность sb.block_size? Как далеко в файл вы ищете?

Chris H 02.05.2018 16:36

Похоже, он должен работать нормально (по крайней мере, материал bitset)

Kostas 02.05.2018 16:42

Почему после считывания c не выводится? Вы выводите все остальное, кроме самого важного аспекта проблемы.

PaulMcKenzie 02.05.2018 16:43

что такое sb.block_size и что такое «бит на пиксель» для файла растрового изображения? Обратите внимание, что в растровых изображениях с высоким содержанием цвета для хранения цвета используются байты.

Barmak Shemirani 02.05.2018 23:44
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
6
59
1

Ответы 1

Я считаю, что проблема кроется в отказе fread.

Попробуйте проверить возвращаемое значение:

if (fread(&c, 1, 1, fp) != 1) { /* error! */ }

Вам также следует подумать об использовании std::ifstream, иначе вы подвержены утечке ресурсов.

Вот какие методы вам потребуются:

std::ifstream file(filename, std::ios::binary);
file.seekg(sb.block_size);
if (!file.good()) { /* error! */ }
file.read(&c, 1);

Другие вопросы по теме