FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
|
#1
|
||||
|
||||
intercalar texto en un archivo
hola amigos, tengo que hacer una aplicacion que abra un archivo y busque la posicion de una cadena y a partir de ahi tiene que insertar n texto. Ese texto a insertar, para obtenerlo, tiene que abrir otro archivo, buscar la misma cadena que en el otro para saber desde donde empezar y buscar otra cadena mas para saber hasta donde. Lo intento explicar mejor, en el archivo A buscaria la cadena <body> para insertar a partir de ahi el texto que obtendrá del archivo B. En B busca <body> y donde lo encuentre sera el inicio de la cadena a copiar. Luego en B buscará </body> y en el lugar que lo encuentre ese será el final. El siguiente paso seria insertar lo obtenido en B dentro de A entre <body> y </body>. He pensado que podria usar un par de TStringList Para hacerlo pero no se me ocurre la manera. ¿Me podeis dar unas pautas y decirme que metodos usar para cada cosa o si lo hariais de otro modo? Las principales dudas son ¿Como busco esas etiquetas? Tengo entendido que Find es para listas ordenadas y solo se me ocurre usar un for y .pos para buscar linea a linea. ¿Como inserto un bloque entero? ¿Tengo que insertar linea por linea? ¿Como borro solo parte de una linea? Se me ocurre usar un ansistring auxiliar pero supongo que habrá formas mejores. Necesito modificar asi cientos de archivos y por eso he pensado en crear una herramienta que lo haga por mi. Perdon por ponerlo todo de corrido pero desde el movil no me deja poner saltos de linea.
|
#2
|
||||
|
||||
Te respondo sin hacer uso de la VCL, sólo con API de windows
Código:
int Search(char *Buffer, char *S, int SizeBuffer) { 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)) return n; } } return -1; } void Inserta(char *FileNameA, char *FileNameB) { 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(hFileA, 0); char* BufferA = new char[SizeA]; char* BufferB = new char[SizeB]; _lread((int)hFileA, BufferA, SizeA); _lread((int)hFileB, BufferB, SizeB); int IniB = Search(BufferB, "<body>", SizeB); if(IniB!=-1){ int FinB = Search(BufferB+IniB, "</body>", SizeB)+IniB; if(FinB!=-1){ int IniA = Search(BufferA, "<body>", SizeA); if(IniA!=-1){ int FinA = Search(BufferA+IniA, "</body>", SizeA)+IniA; if(FinA!=-1){ _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); } Saludos. |
#3
|
||||
|
||||
guau!!! He visto que te has liado y has cambiado algun nombre pero increible amigo. ¡Muchas gracias! Ya lo probaré en cuanto pueda.
|
#4
|
||||
|
||||
Ahora que lo dices y mirando el mensaje, si. Las prisas y el copy/paste de líneas de código similares... Donde dice
Código:
DWORD SizeB = GetFileSize(hFileA, 0); Código:
DWORD SizeB = GetFileSize(hFileB, 0); Saludos. |
#5
|
||||
|
||||
nooo si es fantastico que sea case sensitive. Ahora tengo otra duda, igual que insrto texto, tambien tengo que sustituir texto que se encuentre entre etiquetas, por ejemplo, entre <title> y </title> sustituir lo que haya por lo que hay en el otro archivo entre esas mismas etiquetas. Se me ocurre hacer una copia de la funcion insert y modificarla un poco para que haga eso. Ahora bien, asi tendria que abrir y cerrar el archivo mas de una vez. No se si eso ralentizaria el proceso. ¿Que opinas?
|
#6
|
||||
|
||||
En realidad la función sustituye texto, no inserta. El nombre de la función no es muy afortunado...
Saludos. |
|
|
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 |
|