CFile按行读取并删除行

这篇博客介绍了如何使用CFile类来逐行读取文本文件test.txt,并在读取到特定行后进行删除操作。内容包括对每一行的处理,如在读取'第一行内容'和'第二行内容'后立即删除这些行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

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); 
} 


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值