// Programación en C++ para Ingenieros, Ed. Thomson Paraninfo, 2006
// Capítulo 10: Ficheros




// Inclusión de las librerías
#include <iostream>
#include <fstream>
#include <math.h>

using namespace std;



// Prototipos
void fusionarFicheros(ifstream& f1, ifstream& f2, ofstream& fResu);
template <class T>
void abreFichero(T& fich, const char* nombre);


int main(void)
{
    char nombre1[100], nombre2[100];


    cout << "Introduce el nombre del primer fichero a fusionar: ";
    cin >> nombre1;
    ifstream f1;
    abreFichero(f1, nombre1);


    cout << "Introduce el nombre del segundo fichero a fusionar: ";
    cin >> nombre2;
    ifstream f2;
    abreFichero(f2, nombre2);


    char nombreDest[100];
    cout << "Introduce el nombre del fichero destino: ";
    cin >> nombreDest;
    ofstream fDest;
     abreFichero(fDest, nombreDest);

    fusionarFicheros(f1, f2, fDest);
    f1.close();
    f2.close();
    fDest.close();

    return 0;
}


// Funcion generica para abrir un fichero de
// fomra que se puede usar tanto para ficheros
// de entrada (ifstream) como de salida (ofstream)
template <class T>
void abreFichero(T& fich, const char* nombre)
{
    fich.open(nombre);
    if ( !fich )
    {
        cout << "No puedo abrir el fichero " << nombre << endl;
        exit( 1 );
    }
}


void fusionarFicheros(ifstream& f1, ifstream& f2, ofstream& fDest)
{
    char c;

    f1.unsetf(ios::skipws);
    // Ponemos en fDest el contenido del primer fichero

    while (f1 >> c)
        fDest << c;

    f2.unsetf(ios::skipws);
    // Ponemos en fDest el contenido del segundo fichero

    while (f2 >> c)
        fDest << c;
}