Manejo de archivos
Requisitos de finalización
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;
}
}