Wczytywanie strumienia danych
Ostatnio zmodyfikowano 2011-03-31 01:40
Mapet Temat założony przez niniejszego użytkownika |
Wczytywanie strumienia danych » 2011-03-30 18:06:01 Witam!
Mam problem z wczytaniem danych z pliku a konkretnie nagłowka z bitmapy.
#include <cstdlib> #include <iostream> #include <string> #include <fstream>
using namespace std;
typedef unsigned char BYTE; typedef unsigned short WORD; typedef unsigned long DWORD;
struct RGB { BYTE blue; BYTE green; BYTE red; };
struct BitMapFileHeader { WORD bfType; DWORD bfSize; WORD bfReserved1; WORD bfReserved2; DWORD bfOffBits; };
struct BitMapInfoHeader { DWORD biSize; DWORD biWidth; DWORD biHeight; WORD biPlanes; WORD biBitCount; DWORD biCompression; DWORD biSizeImage; DWORD biXPelsPerMeter; DWORD biYPelsPerMeter; DWORD biClrUsed; BYTE biClrImportant; BYTE biClrRotation; WORD biReserved; };
class BMP { public: BitMapFileHeader BMFH; BitMapInfoHeader BMIH; RGB ** Img; string path; BMP(); ~BMP(); };
BMP::BMP() { fstream in; in.open( "test.bmp", ios::in | ios::binary ); in.read(( char * ) & BMFH, sizeof( BitMapFileHeader ) ); in.read(( char * ) & BMFH, sizeof( BitMapInfoHeader ) ); cout << BMIH.biWidth << endl; }
BMP::~BMP() { }
int main( int argc, char ** argv ) { BMP obrazek; return 0; }
Stworzyłem sobie struktury mające w sumie 54 bajty tyle ile nagłówek i za pomocą read() wczytuje cały blok danych. Niestety dane odczytywane w taki sposób
cout << BMIH.biWidth << endl;
wyprowadza złe wartości. Myślałam że pomyliłem się budując strukturę i za mało bajtów gdzieś dałem ale wygląda wszystko w porządku. Będę wdzięczny za szybką odpowiedź |
|
malan |
» 2011-03-30 21:45:54 Jestem wielki... :D std::cout << BMIH.biSize << std::endl; std::cout << BMIH.biWidth << std::endl; std::cout << BMIH.biHeight << std::endl; 40 800 600 No więc masz..., a właściwie nie masz czegoś, co psuje Ci cały program. Ja nigdy wcześniej nie interesowałem się tego typu rzeczami, a wpisałem 3 litery w wyszukiwarce, poprawiłem Twój kod i rozwiązałem problem :). Także - doczytaj dokładnie o nagłówku pliku :) |
|
Mapet Temat założony przez niniejszego użytkownika |
» 2011-03-31 00:25:35 No ja to robię w ten sposób że wczytuje po przez read każdej zmiennej odpowiednią ilość bajtów i też działa poprawnie. Ale tych zmiennych trochę jest i dużo trzeba pisać. |
|
malan |
» 2011-03-31 00:38:56 Nie rozumiem Cie ;p Ten pseudokod i log to tylko potwierdzenie, że poprawiony przez mnie kod działa. Ostatnie zdanie w moim poście to podpowiedź jak masz rozwiązać swój problem :) |
|
Mapet Temat założony przez niniejszego użytkownika |
» 2011-03-31 01:40:08 Sorry nie zrozumiałem cie, na swoje usprawiedliwienie powiem tylko że o takiej porze ciężko się myśli. Wracając do problemu wszystko stało się jasne gdy zrobiłem sobie sizeof moich struktur. Ni stąd ni z zowąd pojawiły się 2 dodatkowe bajty. Powodem tego był problem z wyrównywaniem bitów a rozwiązaniem było przeniesienie do nowo utworzonej struktury struct bmpfile_magic { WORD bfType; };
Dzięki wielkie za pomoc :P |
|
« 1 » |