Страницы

Поиск по вопросам

среда, 10 июля 2019 г.

Считывание структуры из файла

Столкнулся с проблемой считывания структуры. При считывании в структуру из файла я получаю неверное значение размера самого файла, который указан в заголовке. Прежде всего, я проверил его без структур, то есть просто сдвинул указатель и считал 4 байта информации:
//пример seekp(2); imgf.read((char*)&buf, sizeof(int));
Что у меня выдало верный размер файла. Но гораздо удобнее это все реализовать через структуры, которые у меня не выходит сделать верно. В чем же моя ошибка?
Файл img.h
#ifndef IMG_H #define IMG_H
class img { public: img(char *); ~img();
// Заголовок файла typedef struct tagBITMAPFILEHEADER { unsigned short bfType; unsigned int bfSize; unsigned short bfReserved1; unsigned short bfReserved2; unsigned int bfOffBits; } BITMAPFILEHEADER;
void read_bitmap_f(BITMAPFILEHEADER &); };
#endif // IMG_H
Файл img.cpp
#include "img.h" #include
std::fstream imgf; img::img(char * name_of_img_) { imgf.open(name_of_img_); }
void img::read_bitmap_f(BITMAPFILEHEADER &buf) { imgf.read((char*)&buf, sizeof(buf)); }
img::~img() { imgf.close(); }
Файл main.cpp
#include #include "img.h" int main() { img * imgf = new img("lena512.bmp"); img::BITMAPFILEHEADER buf; imgf->read_bitmap_f(buf); std::cout << buf.bfSize << std::endl; // Выдает 4, хотя на самом деле изображение весит около 243КБ. return 0; }


Ответ

Вместо того, чтобы настраивать упаковку структуры, которая, к тому же, различается от компилятора к компилятору, лучше последовательно считывать значения и заносить их в поля этой структуры. Так как мы имеем дело с C++, для единообразия можно (и желательно) перегрузить оператор operator>>
std::istream& operator>> (std::istream& in, BITMAPFILEHEADER& value) { in >> value.bfType; in >> value.bfSize; in >> value.bfReserved1; in >> value.bfReserved2; in >> value.bfOffBits;
return in; }
Тогда файл img.cpp примет следующий вид:
// ...
void img::read_bitmap_f(BITMAPFILEHEADER& buf) { imgf >> buf; }
// ...

UPD: В комментариях @VladimirGamalian правильно заметил, что автор вопроса открывал файл в текстовом режиме. Чтобы вышеприведённый код работал корректно, с файлом надо работать в двоичном режиме.

Комментариев нет:

Отправить комментарий