![]() |
![]() |
| Paypal | FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
|||||||
| Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Buscar | Temas de Hoy | Marcar Foros Como Leídos |
![]() |
|
|
Herramientas | Buscar en Tema | Desplegado |
|
|
|
#1
|
||||
|
||||
|
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);
}
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. |
|
#2
|
||||
|
||||
|
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?
|
|
#3
|
||||
|
||||
|
Cita:
Código:
if(++Con == Concurrence) Es el valor por defecto. Si no lo pones en la llamada toma ese valor. En delphi también existe. Cita:
Saludos. Última edición por escafandra fecha: 04-07-2014 a las 23:16:01. |
|
#4
|
||||
|
||||
|
ok amigo, mil gracias, ya te cuento que tal me fue.
|
![]() |
| Herramientas | Buscar en Tema |
| Desplegado | |
|
|
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 |
|