Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > C++ Builder
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 04-07-2014
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.210
Poder: 22
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
El problema de varias entradas en la función es que si tienes barias etiquetas del mismo nombre pero en otras partes del archivo, sólo actuará en la primera, por eso te decía lo de un buffer intermedio y hacerlo todo de un tirón.

La versión de Builder que uso es muy antigua. En el caso de que tus archivos sean xml quizás te interese un componente que trabaje con ellos y te facilite la tarea en alto nivel. Yo soy amante del bajo nivel y del hágalo usted mismo...


Saludos.
Responder Con Cita
  #2  
Antiguo 04-07-2014
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.210
Poder: 22
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Otra posibilidad para usar mi función en un bucle es modificar la función Search añadiendo un parámetro que indique la concurrencia que buscas (la 1ª, 2ª, 3ª...) con lo que esa función queda mucho mejor


Saludos.
Responder Con Cita
  #3  
Antiguo 04-07-2014
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 14
aguml Va por buen camino
mmmm interesante. La verdad es que no me preocupa que haya varias entradas con la misma etiqueta ya que es una utilidad muy especifica que solo va a buscar a body y a title y esas no se pueden poner por duplicado ademas de que tanto el template como los datos a insertar los crearé yo a mano y la idea de esta herramienta es porque serán dos templates diferentes y rellenar el doble de htm a mano pues por eso es la idea de crear dos templates diferentes donde tanto el title como el contenido de body son los mismos y podria crear los contenidos en simples txt y luego aplicarlo a todos los templates que quiera. No se si me explico. Lo de la concurrencia ni idea de como hacerlo aunque en esta herramienta no lo necesito. Con estas funciones y un bucle con FindFirstFile y FindNextFile en la que vaya viendo todos los archivos del directorio y metiendo sus nombres en un tstringlist para luego aplicar tus funciones con todos ya tengo lo que deseaba. Cuando ya lo tenga codeado y probado ya te comento.

Última edición por aguml fecha: 04-07-2014 a las 21:20:33.
Responder Con Cita
  #4  
Antiguo 04-07-2014
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.210
Poder: 22
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
  #5  
Antiguo 04-07-2014
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 14
aguml Va por buen camino
hay algunas cosas que no entiendo, en la funcion Search tienes esto: if(i==lstrlen(S)) if(Con++ == Concurrence) return n;
 }
, la parte de Con++ ¿Primero compara y luego incrementa? Otra cosa, veo que Concurrencia en la declaracion haces = 0 ¿Es 0 si no introduces ningun valor en ese argumento pero si introduces otro valor ya no es 0? Es que nunca vi que declararan asi una funcion. ¿La funcion search recive el numero de veces a buscarlo y cuando encuentra esa cantidad de concurrencias retorla la posicion de la ultima? O sea que a replace le indico que me reemplace lo que esté dentro de la etiqueta body tercera digamoslo asi, y en search buscaria la tercera y sa seria la posicion que retornaria ¿No?
Responder Con Cita
  #6  
Antiguo 04-07-2014
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.210
Poder: 22
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Cita:
Empezado por aguml Ver Mensaje
hay algunas cosas que no entiendo, en la funcion Search tienes esto: if(i==lstrlen(S)) if(Con++ == Concurrence) return n;
 }
, la parte de Con++ ¿Primero compara y luego incrementa?
Exacto. Sin embargo esto:
Código:
if(++Con == Concurrence)
Primero incrementa y luego compara. Se trata de las contracciones de C. Puedes no usarlo escribiendo un poco más de código.

Cita:
Empezado por aguml Ver Mensaje
Otra cosa, veo que Concurrencia en la declaracion haces = 0
Es el valor por defecto. Si no lo pones en la llamada toma ese valor. En delphi también existe.

Cita:
Empezado por aguml Ver Mensaje
¿La funcion search recive el numero de veces a buscarlo y cuando encuentra esa cantidad de concurrencias retorla la posicion de la ultima? O sea que a replace le indico que me reemplace lo que esté dentro de la etiqueta body tercera digamoslo asi, y en search buscaria la tercera y sa seria la posicion que retornaria ¿No?
Busca el número de concurrencia que quieres, teniendo en cuenta que la primera es la 0. Claro que si "amputas" el buffer en su inicio, como hago al buscar </body> entonces no debes usarlo puesto que el primero que encuentre será el que buscas. Mira el código cuando busco los puntos finales.


Saludos.

Última edición por escafandra fecha: 04-07-2014 a las 23:16:01.
Responder Con Cita
  #7  
Antiguo 04-07-2014
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 14
aguml Va por buen camino
ok amigo, mil gracias, ya te cuento que tal me fue.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Intercalar Forms Jorge Hernández Varios 4 30-04-2014 18:58:12
intercalar digitos luisito2011 Varios 6 04-12-2012 18:38:57
intercalar paginas con fastreport mferrero Impresión 1 26-02-2008 13:36:54
Intercalar Variable en SQL... foetus SQL 7 09-07-2007 02:21:28
Como puedo grabar texto en un Archivo de Texto sin Sobreescribir???? AGAG4 Varios 12 08-11-2005 22:53:00


La franja horaria es GMT +2. Ahora son las 05:20:56.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi