Ver Mensaje Individual
  #15  
Antiguo 04-07-2014
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.197
Reputación: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
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.

Última edición por escafandra fecha: 04-07-2014 a las 21:33:13.
Responder Con Cita