
Neo_Fr
|
Si tu veut que se soit vraiment rapide, oublie les string, ofstream and co..;
utilise directement les apis..
Je t'ai fait une fonction, pour l'utiliser tu devras te procurer ReadLine.c et ReadLine.h ici: http://www.cppfrance.com/codes/WIN32-LIRE-FICHIER-LIGNE-LIGNE_44453.aspx
Voici la fonction change szInFile et szOutFile par les chemins appropriés..
tu peut changer les valeur de dwTab[] pour effacer les lignes que tu veux..
DWORD __stdcall GetNumberOfLine(LPSTR lpszFilePath)
{
HANDLE hFile;
DWORD dwLines = 0, dwByteRead, i;
BYTE* lpData;
lpData = (BYTE*) HeapAlloc(GetProcessHeap(), 0, 0x100000);
if(!lpData) return 0;
hFile = CreateFile(lpszFilePath, GENERIC_READ, 0, 0, OPEN_EXISTING, 0, 0);
if(hFile == INVALID_HANDLE_VALUE) return 0;
while(1)
{
if(!ReadFile(hFile, lpData, 0x100000, &dwByteRead, 0)) goto _Error;
if(!dwByteRead) break;
i = dwByteRead;
do
{
if(lpData[i] == 0x0D) dwLines++;
}while(i--);
}
_Error:
HeapFree(GetProcessHeap(), 0, lpData);
CloseHandle(hFile);
return dwLines;
}
DWORD __stdcall EraseLines(LPSTR lpszInFile, LPSTR lpszOutFile, LPDWORD lpdwLinesTab, DWORD nbLines)
{
const DWORD dwMaxLineSize = 4096;
LPOPENL lpoLine;
HANDLE hFile;
DWORD dwLinesErased = 0, dwLines = 1, dwLinesLeft, dwLineLen, bw, i;
BOOL bWrite;
BYTE* lpBuff;
lpBuff = (BYTE*) HeapAlloc(GetProcessHeap(), HEAP_NO_SERIALIZE, dwMaxLineSize);
if(!lpBuff) goto _Error;
dwLinesLeft = GetNumberOfLine(lpszInFile);
if(!dwLinesLeft) goto _Error;
lpoLine = OpenLine(lpszInFile, GetTypeOfFile(lpszInFile));
if(!lpoLine) return 0;
hFile = CreateFile(lpszOutFile, GENERIC_WRITE, 0, 0, CREATE_ALWAYS, 0, 0);
if(hFile == INVALID_HANDLE_VALUE) goto _Error;
do
{
dwLineLen = ReadLine(lpoLine, dwLines, lpBuff);
if(!dwLineLen) goto _Error;
*((WORD*) &lpBuff[dwLineLen]) = '\r\n'; dwLineLen+=2;
i = nbLines;
bWrite = TRUE;
do
{
if(dwLines == lpdwLinesTab[i]) bWrite = FALSE;
}while(i--);
if(bWrite) { if(!WriteFile(hFile, lpBuff, dwLineLen, &bw, 0)) goto _Error; }
else dwLinesErased++;
dwLines++;
}while(dwLinesLeft--);
_Error:
if(hFile) CloseHandle(hFile);
if(lpoLine) CloseLine(lpoLine);
HeapFree(GetProcessHeap(), HEAP_NO_SERIALIZE, lpBuff);
return dwLinesErased;
}
int main(void)
{
DWORD dwLinesErased;
char szInFile[] = "C:\\ton_fichier_originale.txt";
char szOutFile[] = "C:\\ton_fichier_de_sortie.txt";
DWORD dwTab[6] = { 3, 5, 8, 16, 18, 32 };
dwLinesErased = EraseLines(szInFile, szOutFile, dwTab, (sizeof(dwTab)/sizeof(DWORD)));
printf("%i lignes effacées...\n", dwLinesErased);
system("PAUSE");
return 0;
}
Neo_Fr
|