Cambiar TAGS de un fichero por información
Esto que voy a contar de forma breve tiene relación con el escrito titulado "¿tres capas?"1 en el cual expongo una forma de realizar interfaces de usuario de forma sencilla mediante la utilización de html y cgi.
En un momento dado relato que el cgi escrito en C/C++ deberá pasear el documento html que se quiere presentar al usuario y que se cambiarán ciertos TAGS presentes en dicha página por datos que decide la capa de negocio o parte inteligente de la aplicación.
Esto, en general, se hace parseando el documento de la forma en que se describió en el ártículo anterior, pero hay una forma mucho más rápida y sencilla la cual paso a describir ahora.
Sencillamente en el documento que será presentado se añade un %s en cada punto donde se quiera añadir algo de forma dinámica. Para que quede claro, se escribe el documento html a mano o como queramos y donde nos interese añadir algo se introduce un %s.
Supongo que cualquiera que sepa algo de C/C++ ya ve por donde me estoy encaminando. Efectivamente, cuando se va a presentar el documento y ya lo hemos leido del disco duro y lo tenemos en forma de string, sin parsear ni hacer nada complicado se puede sustituir el %s por lo que queramos con un sencillo "sprintf()" y lo mejor es que podemos poner tantos %s como queramos.
Os recomiendo man sprintf, pero en general se utiliza mucho y seguro que lo conocéis. En cualquier caso y por encima, el sprintf es exactamente igual que un printf() pero en vez de utilizar la salida estándar, lo que hace es copiar el string en la memoria que se haya reservado a tal efecto, sustitiyendo, en este caso, todos los %s por lo que se ponga a partir del tercer parámetro.
Ejemplo clarificador:
sprintf(ptr_memoria,"HOLA %s ADIOS","PEPE");
Como resultado, tendríamos un string llamado ptr_memoria con la información "HOLA PEPE ADIOS"
Si queremos sustituir un valor numérico podríamos poner %d y un número directamente. Sigo recomendando un man sprintf a quien no lo conozca adecuadamente.
Bueno, lo contado es algo muy sencillo y desde luego es muy probable que este método lo utilice mucha gente, pero puede ser que no a todo el mundo se le ocurra que poner un %s directamente en los documentos nos facilite el trabajo tanto.
Voy a poner una clase de C++ que hace exactamente esto, por si alguien quiere utilizarla o le da una idea. No está muy comentada, pero es bastante autoexplicativa.
Las funciones open_file, read_file, close_file son una encapsulación de funciones de C para el manejo de ficheros y realizán exactamente lo que su nombre indica.
La función CambiarTag puede cambiar hasta 6 %s que se pasan en un array de strings, con eso me vale a mi de sobra y el que quiera más parámetros o que se realice de forma iterativa que lo piense un poco.
Recordar que hay que liberar la memoria que se devuelve en esta función en donde se llame.
#include "GeneradorHtml.h"
#include "../comunes/file_control.h"
#include <string.h>
#include <stdio.h>
#define MAX_ELEMENTOS 6
GeneradorHtml::GeneradorHtml(char *lruta)
{
char *ptr_ayuda;
open_file(lruta,"r");
read_file(&ptr_ayuda);
texto_html = new char[strlen(ptr_ayuda)] ;
strcpy(texto_html,ptr_ayuda);
close_file();
}
GeneradorHtml::~GeneradorHtml()
{
delete texto_html;
}
//Hay que liberar en donde se utilice la memoria que se devuelve.
char* GeneradorHtml::CambiarTag(char lnuevo_elemento[][100])
{
int llen_elementos = 0;
int llen_html = strlen(texto_html);
int llen_total = 0;
char *lnuevo_html = 0;
int i;//iterador
for(i = 0; i<MAX_ELEMENTOS; i++)
{
if(lnuevo_elemento[i] == 0)
break;
llen_elementos = llen_elementos + strlen(lnuevo_elemento[i]);
}
//espacio necesario para albergar todo el texto html cambiando las partes necesarias.
llen_total = llen_elementos + llen_html;
lnuevo_html = new char[llen_total+100];
switch(i)
{
case 0:
strcpy(lnuevo_html,texto_html);
break;
case 1:
sprintf(lnuevo_html,texto_html,lnuevo_elemento[0]);
//sprintf(lnuevo_html,texto_html,"HOLA");
break;
case 2:
sprintf(lnuevo_html,texto_html,lnuevo_elemento[0],lnuevo_elemento[1]);
break;
case 3:
sprintf(lnuevo_html,texto_html,lnuevo_elemento[0],lnuevo_elemento[1],lnuevo_elemento[2]);
break;
case 4:
sprintf(lnuevo_html,texto_html,lnuevo_elemento[0],lnuevo_elemento[1],lnuevo_elemento[2],lnuevo_elemento[3]);
break;
case 5:
sprintf(lnuevo_html,texto_html,lnuevo_elemento[0],lnuevo_elemento[1],lnuevo_elemento[2],lnuevo_elemento[3],lnuevo_elemento[4]);
break;
case MAX_ELEMENTOS:
sprintf(lnuevo_html,texto_html,lnuevo_elemento[0],lnuevo_elemento[1],lnuevo_elemento[2],lnuevo_elemento[3],lnuevo_elemento[4],lnuevo_e
break;
}
return lnuevo_html;
}

rss
Comments
No comments.