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

数据恢复软件(五):用C语言重写了C++的扩展程序.

2013-12-11 22:00 369 查看
这个程序与上个C++的程序实现的功能完全相同.写这个程序的目的是两个:第一可以比较一下C与C++的语言写法的不同.第二比较一下两种写法谁的速度更快.有兴趣的朋友可以比较一下.

#include <windows.h>
#include <iostream>
using namespace std;
#define MAXSIZE 5*1024*1024
HANDLE f;
DWORD fsize;
UINT fpoint;
struct BmpHeader{
WORD ND;
WORD TYPE;
UINT size;
WORD r1;
WORD r2;
}bh;
const unsigned char PngHeader[8] = { 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A };
const unsigned char PngFooter[8] = { 0x49, 0x45, 0x4E, 0x44, 0xAE, 0x42, 0x60, 0x82 };
VOID Read(void* lpBuf,UINT nCount)
{
DWORD Num;
::SetFilePointer(f,fpoint,NULL,FILE_BEGIN);
::ReadFile(f,lpBuf,nCount,&Num,NULL);
}
VOID Write(LPCTSTR lp,void* lpBuf,UINT nCount)
{
DWORD Num;
HANDLE fout;
fout=::CreateFile(lp,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
::WriteFile(fout,lpBuf,nCount,&Num,NULL);
CloseHandle(fout);
}
VOID BmpGetName(char* c)
{
sprintf(c,"%d.bmp",fpoint);

}
VOID PngGetName(char* c)
{
sprintf(c,"%d.png",fpoint);

}
VOID Recover(UINT nCount,char* c)
{
char *dout=new char[nCount];
Read(dout,nCount);
Write(c,dout,nCount);
delete [] dout;
}
UINT BmpComRaw()
{
Read(&(bh.TYPE),10) ;
if(bh.TYPE==MAKEWORD('B','M')&&bh.r1==0&&bh.r2==0)
{
char fname[20];
BmpGetName(fname);
Recover(bh.size,fname);
return bh.size;
}
else
{
return 0;
}
}
UINT PngComRaw()
{
CHAR temp[8];
Read(temp,8) ;
for(int i=0;i<8;i++)
{
if (temp[i]!=PngHeader[i])
{
break;
}
if (i==7)
{
CHAR *tempdata=new CHAR[MAXSIZE];
Read(tempdata,MAXSIZE);
CHAR *p;
for (int i=0;i<MAXSIZE;i++)
{
p=tempdata+i;
for(int j=0;j<8;j++)
{
if (*(p+j)!=PngFooter[j])
{
break;
}
if (j==7)
{
char fname[20];
PngGetName(fname);
Recover(i,fname);
return i;
}
}
}
delete [] tempdata;
}
}
return 0;
}
VOID init(LPCTSTR lp)
{
f=::CreateFile(lp,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
if(f==INVALID_HANDLE_VALUE)
{
cout<<"can't open file"<<endl;
exit(0);
}
fsize=::GetFileSize(f,NULL);
fpoint=0;
}
void main()
{
init("img");
UINT(*r[2])()={BmpComRaw,PngComRaw};
while(fpoint<fsize)
{
for (int j=0;j<sizeof(r)/sizeof(r[0]);j++)
{
(*r[j])();
}
fpoint+=512;
}
cout<<"scan end"<<endl;
}


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