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