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





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

using namespace std;

// Declaración tipos
typedef struct{
    char simbolo[4];
    float posX, posY, posZ;
}molecula;

void leerXYZ(int& numAtomos, molecula* mol)
{
    int i;
    ifstream fichero;
    char linea[250];

    fichero.open("graphite.xyz");

    if (!fichero)
    {
        cout << "No puedo abrir el fichero" << endl;
        exit(1);
    }

    // Cabecera
    fichero >> numAtomos;
    // Leemos el resto de la línea
    fichero.getline(linea, 249);
    // Leemos los comentarios
    fichero.getline(linea, 249);
    cout << numAtomos << endl << linea << endl;

    // Primero reservamos el espacio
    mol = new molecula[numAtomos];

    // Leemos los átomos
    for (i = 0; i < numAtomos; i++)
    {
        fichero >> mol[i].simbolo;
        fichero >> mol[i].posX >> mol[i].posY >> mol[i].posZ;
    }
}

int main(void)
{
    int numAtomos, i;
    molecula* mol;

    leerXYZ(numAtomos, mol);

    for (i = 0; i < numAtomos; i++)
    {
        cout << mol[i].simbolo << " " << mol[i].posX << " ";
        cout << mol[i].posY << " " << mol[i].posZ << endl;
    }

    return 0;
}



void escribirXYZ(int nAtomos, molecula* mol, char* descrip)
{
    int i;
    ofstream fichero;

    fichero.open("molecula.xyz");

    if (!fichero)
    {
        cout << "No puedo abrir el fichero" << endl;
        exit(1);
    }

    // Escribimos la cabecera, el número de átomos
    // y la descripción
    fichero << nAtomos << endl;
    fichero << descrip << endl;

    // Escribimos los átomos
    for (i = 0; i < nAtomos; i++)
    {
        fichero << mol[i].simbolo << " ";
        fichero << mol[i].posX << " ";
        fichero << mol[i].posY << " ";
        fichero << mol[i].posZ << endl;
    }
}