Столкнулся с проблемой считывания структуры. При считывании в структуру из файла я получаю неверное значение размера самого файла, который указан в заголовке. Прежде всего, я проверил его без структур, то есть просто сдвинул указатель и считал 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
Ответ
Вместо того, чтобы настраивать упаковку структуры, которая, к тому же, различается от компилятора к компилятору, лучше последовательно считывать значения и заносить их в поля этой структуры. Так как мы имеем дело с 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 правильно заметил, что автор вопроса открывал файл в текстовом режиме. Чтобы вышеприведённый код работал корректно, с файлом надо работать в двоичном режиме.
Комментариев нет:
Отправить комментарий