数据恢复软件(二):用C++重写恢复BMP位图文件的小程序
2013-11-26 21:52
399 查看
我用C++的面向对象的设计方法重新编写了上个恢复BMP的位图程序.这个看起来有点软件框架的味道了吧,但代码多了不少.写这个小程序还无法体现C++语言的优势来吧.
本文出自 “锦州数据恢复-硬盘之家” 博客,请务必保留此出处http://jzhdd.blog.51cto.com/287199/1332104
#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
相关文章推荐
- Advanced C++ | Conversion Operators
- Use of explicit keyword in C++
- 初探C++数组的size可以是变量
- c语言学习记录--求出1000以内所有完数,并输出其因子
- When should we write our own assignment operator in C++?
- 【Leetcode】Reverse Linked List II
- Copy constructor vs assignment operator in C++
- 【转】C++连接SQL2000
- C++图书推荐
- RTTI (Run-time type information) in C++
- C++ - 深度搜索遍历文件夹
- C++ - 深度搜索遍历文件夹
- Advanced C++ | Virtual Copy Constructor
- C++ 继承和派生
- 【Leetcode】Add Binary
- 数组排序--计算最小交换次数
- Advanced C++ | Virtual Constructor
- 导出C++ dll文件
- C++对象的内存布局深层剖写(下)
- 非C++内建型别A和B, 在哪几种情况下B能隐式转化为A?