martes, 14 de mayo de 2013

Punteros y archivos en c++

En una entrada anterior, hable acerca de los array dinamicos con punteros. Sin embargo, no puse un ejemplo muy avanzado si no algo realmente sencillo. Para remediar eso, traigo este ejemplo usando C++. Algo si, hay un error en la función imprimir dado que no me quería recibir los parámetros tal cual lo declare para iterar sobre el array, entonces esa la dejo para que ustedes la corrijan.

En cuanto al resto, pueden leer y analizar el código a continuación.

El programa solicita nombres y apellidos de una persona, los guarda en un archivo de texto y posteriormente los imprime tras leerlos desde el archivo.

Sin más preámbulo.

#include <iostream>
#include <fstream>
#include <cstdlib>
#include "split_class.h"
using namespace std;
string* datos=NULL;
struct Persona
{
    string Nombre;
    Persona * cargar_personas(int &n, Persona lista_personas[])
    {
    }
    /*void imprimir(Persona * plista_personas, int n)
    {
        cout<<lista_personas[i].Nombre<<" "<<lista_personas[i].Apellido<<" "<<lista_personas[i].Cedula<<endl;
    }
}
*/
void guardar(Persona lista_personas[], int n, char nombre_archivo[])
{
    fstream archivo(nombre_archivo, ios::in |
    archivo.close();
    void leer_archivo(char nombre_archivo[], int n)
    {
        fstream archivo(nombre_archivo, ios::in |
        char letra=NULL;
        int main()
        {
            int n=0;
            lista_personas= new Persona[n];
            char nombre_archivo[50];
            string Apellido;
            int Cedula;
        }
        ;
        cout<<"||Bienvenido||"<<endl;
        cout<<"Por favor ingrese los datos de la Persona n"<<endl;
        for(int i=0;
        i<n;
        i++)
        {
            cout<<"Nombre: "<<endl;
            cin>>lista_personas[i].Nombre;
            cout<<"Apellido: "<<endl;
            cin>>lista_personas[i].Apellido;
            cout<<"Cedula: "<<endl;
            cin>>lista_personas[i].Cedula;
        }
        Persona * p_lista_personas=lista_personas;
        return p_lista_personas;
        cout <<"pos"<<* plista_personas[0].Nombre;
        Persona * lista_personas=NULL;
        lista_personas=new Persona[n];
        lista_personas= plista_personas;
        cout<<"Imprimo "<< n <<endl;
        for (int i=0;
        i<n;
        i++)
        {
            ios::out | ios::trunc);
            for(int i=0;
            i<n;
            i++)
            {
                archivo << lista_personas[i].Cedula <<"||"<<lista_personas[i].Nombre<<"||"<<lista_personas[i].Apellido<<"n"<<flush;
            }
        }
        ios::out);
        string linea="";
        datos= new string[n];
        //string datos[n];
        archivo.seekg(0L, ios::end);
        //int longitud = archivo.tellg();
        int j=0;
        for(int i=0L;
        i<n;
        i++)
        {
            linea="";
            while(letra!='n')
            {
                //cout << letra;
                archivo.seekg(j,ios::beg);
                archivo.get(letra);
                //cout << letra;
                linea=linea+letra;
                j++;
            }
            letra=NULL;
            datos[i]=linea;
            cout<<datos[i]<<endl;
        }
        string * p_datos=datos;
        cout<<"imprimiendo antes de enviar"<<endl;
        /*for(int i=0;
        i<n;
        i++)
        {
            cout<<datos[i]<<endl;
        }
        */
    }
    Persona * lista_personas=NULL;
    cout<<"Este programa solicita los datos de dos personas y luego los muestra en pantallar"<<endl;
    cout<<"Cuantas personas desea registrar: "<<endl;
    cin>>n;
    Persona * p_lista_persona=cargar_personas(n, lista_personas);
    lista_personas=p_lista_persona;
    cout <<"Ingrese el nombre del archivo: ";
    cin >> nombre_archivo;
    guardar(lista_personas, n, nombre_archivo);
    leer_archivo(nombre_archivo, n);
    cout<<"---------------------------------"<<endl;
    cout<<"Imprimiendo la salida del archivo"<<endl;
    for(int i=0;
    i<n;
    i++)
    {
        //cout <<"se pego el for";
        splitstring cadena(datos[i]);
        vector<string> campos=cadena.split('|',1);
        lista_personas=NULL;
        lista_personas=new Persona[n];
        /*
        cout<<"Depuracion"<<endl;
        for (int k = 0;
        k < campos.size();
        k++)
        cout << k << " => " << campos[k] << endl;
        cout<<"Fin_Depuracion"<<endl;
        */
        for(int j=0;
        j<campos.size();
        j++)
        {
            if(j==0)
            {
                // caso de cedula
                lista_personas[i].Cedula=atoi(campos[j].c_str());
            }
            else if(j==2)
            {
                // caso de nombre
                const char* nombre_char = campos[j].c_str();
                lista_personas[i].Nombre= nombre_char;
            }
            else if(j==4)
            {
                // caso de apellido
                lista_personas[i].Apellido=campos[j].c_str();
            }
        }
        cout<<i<<")"<<lista_personas[i].Cedula<<";
        "<<lista_personas[i].Nombre<<";
        "<<lista_personas[i].Apellido<<endl;
    }
    //imprimir(lista_personas,n);
    cout<<""<<endl;
}