Manejo de archivos

10. archivo plantilla

/*
 * Manejo de archivos
 * =====================================
 * Genera un archivo en base a un archivo plantilla.
 * Completa los campos identificados con etiquetas
 * 
 * Germán Andrés Xander 2021>
 *
 * ======================================
 * ejemplo plantilla.txt
 *
 * Yo soy <nombre> <apellido>,
 * tengo <edad> años
 * y me gusta <hobby>
 */


#include <iostream>
#include <fstream>
#include <string>
using namespace std;

bool buscar(ifstream &plantilla, ofstream &salida); // por referencia para no trabajar sobre una copia
bool crear(ofstream &salida, string nombre);

int main(int argc, char **argv){
    ifstream plantilla ("plantilla.txt");   //abro el archivo con la plantilla
    ofstream salida;      // creo objeto salida sin archivo asociado
    if (plantilla.is_open()){
        if(!buscar(plantilla, salida)){   
            cout<<"No se pudo crear el archivo de salida";
            plantilla.close();
            return -1;
        }
        plantilla.close();
        salida.close();
    }
    else cout << "no se puede abrir el archivo"; 
    return 0;
}

bool buscar(ifstream & plantilla, ofstream &salida){ // busco las etiquetas y reemplazo por datos del usuario
    string linea ,etiqueta, dato;
    while (getline(plantilla,linea)) {      //leo linea x linea
        size_t posicion1=0;
        size_t posicion2=0;
        while((posicion1=linea.find("<",posicion1)) != string::npos ){  //encuentro las etiquetas
            posicion2=linea.find(">",posicion1);
            etiqueta=linea.substr(posicion1+1,posicion2-posicion1-1);   //extraigo la etiqueta
            cout<<endl<<"Ingrese su "<<etiqueta<<": "<<endl;
            getline (cin,dato);
            if(etiqueta.compare("nombre")==0){      //si la etiqueta es nombre
                if(!crear(salida,dato)){     // genero un archivo con el nombre ingresado
                    return 0;
                }
            }
            linea.replace(posicion1, posicion2-posicion1+1, dato);  //reemplazo la etiqueta por el dato ingresado
            posicion1=posicion2;
        }
        salida<<linea<<endl;        //grabo la linea
    }
    return 1;
}

bool crear(ofstream &salida, string nombre){
    nombre.append(".txt");
    salida.open(nombre, ofstream::out | ofstream::trunc);   //trunc: piso archivos existentes
    if(salida.is_open()){
        return 1;
    }else{
        return 0;
    }
}