這個程序與上個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; }