您的位置:首页 > 编程语言 > C语言/C++

数据恢复软件(二):用C++重写恢复BMP位图文件的小程序

2013-11-26 21:52 399 查看
我用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;
}


本文出自 “锦州数据恢复-硬盘之家” 博客,请务必保留此出处http://jzhdd.blog.51cto.com/287199/1332104
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: