CFile按行读取并删除行

 

test.txt
line1   第一行内容
line2   第二行内容
line3   第三行内容


程序读出   “第一行内容”   之后   删除。
在读取将读出   “第二行内容”   之后   删除。


 

void   CReplaceRowDlg::RemoceRow(int   nRow,   char*   sFile) 
{ 
HANDLE   hFile   =   CreateFile(sFile,   GENERIC_WRITE   |   GENERIC_READ,   0,   
NULL,   OPEN_EXISTING,   FILE_ATTRIBUTE_NORMAL,   NULL); 
      if   (hFile   ==   INVALID_HANDLE_VALUE)   
      { 
            AfxMessageBox( "文件不存在或文件错!   "); 
            return; 
      } 
      //   Get   the   size   of   the   file   (I   assume   the   whole   file   can   be   mapped). 
      DWORD   dwFileSize   =   GetFileSize(hFile,   NULL); 
      if   (dwFileSize <1)return   ; 
HANDLE   hFileMap   =   CreateFileMapping(hFile,   NULL,   PAGE_READWRITE,   0,   dwFileSize   ,   NULL); 
      if   (hFileMap   ==   NULL)   
      { 
      AfxMessageBox( "文件映射错!   "); 
            CloseHandle(hFile); 
            return   ; 
      } 
      //long   nRowNumber=5; 
      long   nCur=0; 
      PVOID   pvFile=MapViewOfFile(hFileMap,   FILE_MAP_WRITE,   0,   0,0   ); 
char*   p=(char*)pvFile; 
long   nSize=dwFileSize;///用来判断还有多少没有读取,也就是是否到文件尾 
while(nCur <nRow-1   &&   nSize> 0) 
{ 
if( '\n '==*p)nCur++; 
p++; 
nSize--; 
} 
DWORD   dwRowLen=0; 
if(nCur==nRow-1   &&   nSize> 0) 
{ 
///删除第nRow行 
char*   pBuf=p; 
nCur=0; 
while(nCur <1   &&   nSize> 0)///可能会友空行 
{ 
if( '\n '==*pBuf)nCur++; 
pBuf++; 
nSize--; 
} 
char*   pp=(char*)pvFile; 
if(nSize> 0)///nRow后面还有数据///后面部分的长度 
{ 
dwRowLen=pBuf-p;///该行的长度 
DWORD   dwItem=64*1024;///以64k为单位的缓存 
char   *   pMyBuf=(char*)   HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,dwItem); 
while(nSize> 0) 
{ 
nSize-=dwItem; 
if(nSize> =0) 
{ 
memcpy(pMyBuf,pBuf,dwItem); 
pBuf+=dwItem; 
memcpy(p,pMyBuf,dwItem); 
p+=dwItem; 
} 
} 
if(nSize <0) 
{ 
nSize+=dwItem; 
memcpy(pMyBuf,pBuf,nSize); 
memcpy(p,pMyBuf,nSize); 
} 
HeapFree(GetProcessHeap(),0,pMyBuf); 
} 
} 
UnmapViewOfFile(pvFile); 
CloseHandle(hFileMap); 
SetFilePointer(hFile,dwFileSize-dwRowLen,NULL,FILE_BEGIN); 
SetEndOfFile(hFile); 
CloseHandle(hFile); 
} 


 

你可能感兴趣的:(File,null)