Bueno, ahora que he tenido un ratico con el PC te muestro la modificación con concurrencias:
Código:
int Search(char *Buffer, char *S, int SizeBuffer, int Concurrence = 0)
{
int Con = 0;
for(int n= 0; n<SizeBuffer-lstrlen(S); n++){
if(Buffer[n] == *S){
int i=1;
for(; S[i]; i++)
if(Buffer[n+i]!=S[i]) break;
if(i==lstrlen(S)) if(Con++ == Concurrence) return n;
}
}
return -1;
}
void Replace(char *FileNameA, char *FileNameB, int Concurrence = 0)
{
HANDLE hFileA = CreateFile(FileNameA, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_FLAG_WRITE_THROUGH, 0);
if(hFileA!=(HANDLE)(-1)){
HANDLE hFileB = CreateFile(FileNameB, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_FLAG_WRITE_THROUGH, 0);
if(hFileB!=(HANDLE)(-1)){
DWORD SizeA = GetFileSize(hFileA, 0);
DWORD SizeB = GetFileSize(hFileB, 0);
char* BufferA = new char[SizeA+SizeB];
char* BufferB = new char[SizeB];
_lread((int)hFileA, BufferA, SizeA);
_lread((int)hFileB, BufferB, SizeB);
int IniB = Search(BufferB, "<body>", SizeB, Concurrence);
if(IniB!=-1){
int FinB = Search(BufferB+IniB, "</body>", SizeB);
if(FinB!=-1){
FinB += IniB;
int IniA = Search(BufferA, "<body>", SizeA, Concurrence);
if(IniA!=-1){
int FinA = Search(BufferA+IniA, "</body>", SizeA);
if(FinA!=-1){
FinA += IniA;
_llseek((int)hFileA, FILE_BEGIN, 0);
SetEndOfFile(hFileA);
_lwrite((int)hFileA, BufferA, IniA);
_lwrite((int)hFileA, BufferB + IniB, FinB-IniB);
_lwrite((int)hFileA, BufferA + FinA, SizeA-FinA);
}
}
}
}
delete [] BufferA;
delete [] BufferB;
}
CloseHandle(hFileB);
}
CloseHandle(hFileA);
}
La primera concurrencia es la 0.
Aprovecho mara reservar más memoria para el BufferA para asegurar que no se queda corto si FileB es más grande.
Saludos.