我用C++的面向對象的設計方法重新編寫了上個恢復BMP的位圖程序.這個看起來有點軟件框架的味道了吧,但代碼多了不少.寫這個小程序還無法體現C++語言的優勢來吧.
#include "windows.h" #include "stdio.h" class Raw { private: HANDLE f; DWORD Num; DWORD filesize; public: DWORD open(LPCTSTR lp) { f=::CreateFile(lp,GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL); if(f==INVALID_HANDLE_VALUE){return 0;} filesize=::GetFileSize(f,NULL); return filesize; } void read(int i,LPVOID lp,DWORD nNumberOfBytesToRead) { ::SetFilePointer(f,i,NULL,FILE_BEGIN); ::ReadFile(f,lp,nNumberOfBytesToRead,&Num,NULL); } virtual int comraw(int i)=0; void recover(int i,int fsize) { HANDLE fout; char fname[20]; ::SetFilePointer(f,i,NULL,FILE_BEGIN); char *dout=new char[fsize]; ::ReadFile(f,dout,fsize,&Num,NULL); sprintf(fname,"%d.bmp",i); fout=::CreateFile(fname,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL); ::WriteFile(fout,dout,fsize,&Num,NULL); delete [] dout; CloseHandle(fout); } virtual ~Raw() { CloseHandle(f); } }; class BmpRaw :public Raw { private: struct BMPHEADER{ WORD ND; WORD TYPE; int size; WORD r1; WORD r2; }bh; public: virtual int comraw(int i) { read(i,&(bh.TYPE),10) ; if(bh.TYPE==MAKEWORD('B','M')&&bh.r1==0&&bh.r2==0) { return bh.size; } else { return 0; } } }; int main() { DWORD filesize; int fsize; Raw *r; BmpRaw br; r=&br; filesize=r->open(("img")); if (filesize==0) { return 0; } for (int i=0;i<(int)filesize;i+=512) { if((fsize=r->comraw(i))!=0) { r->recover(i,fsize); i=(fsize/512)*512; } } return 0; }