elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Entrar al Canal Oficial Telegram de elhacker.net


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Guardar Información de una lista ligada en un archivo .txt
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Guardar Información de una lista ligada en un archivo .txt  (Leído 4,738 veces)
EdsonGuizar

Desconectado Desconectado

Mensajes: 1


Ver Perfil
Guardar Información de una lista ligada en un archivo .txt
« en: 22 Abril 2016, 04:19 am »

Buenas... Soy nuevo en esto, espero poder explicar bien mi duda:

Estoy creando un programa de nómina básico, donde el usuario ingresa datos del empleado, como nombre, ID, departamento, etc... Estoy usando como estructura de datos una lista ligada simple. No tengo problemas con agregar nodos, ni eliminar alguno. Todo corre bien (o eso creo). Lo que pasa es que no sé como guardar todos los datos de los empleados en un archivo .txt, para que cuando vuelva a ejecutar el programa aparezcan de nuevo... El primer código es la implementación de la clase Lista, Nodo, y Empleado. El segundo código es la implementación de la clase Nomina, donde tengo unas funciones para cargar y guardar el archivo, pero a lo más, me guarda la información del primer empleado que añadí, pero si cierro el programa y lo ejecuto de nuevo, no aparece ningún dato. En verdad agradecería su ayuda.

Código:
//
//  Empleado.h
//  ELE
//
//  Created by Edson Guízar on 21/04/16.
//  Copyright (c) 2016 Edson Jardiel Guízar Cruz. All rights reserved.
//

#include<iostream>
#define N1 1750
#define N2 1100
#define N3 750
#define N4 390
#define N5 240


using namespace std;

/* Prototipo de la plantilla de la clase Lista. AsÌ, en la clase NodoLista
 se podr· hacer referencia a ella. */

template <class T>
class Lista;

template <class T>
class NodoLista
{
private:
    NodoLista<T> *Liga;
    T Info;
public:
    NodoLista();
    T RegresaInfo();
    NodoLista<T>*RegresaLiga();
    void setInfo(T info);
    friend class Lista<T>;
    friend class NominaC;
};

/* DeclaraciÛn del mÈtodo constructor por defecto. Inicializa con el valor NULL
 al apuntador al siguiente nodo. */
template <class T>
NodoLista<T>::NodoLista()
{
    Liga=NULL;
}

/* MÈtodo que permite, a usuarios ajenos a la clase, conocer el valor del
 atributo Info. */
template <class T>
T NodoLista<T>::RegresaInfo()
{
    return Info;
}

template <class T>
NodoLista<T>* NodoLista<T>::RegresaLiga(){
    
    return Liga;
}

template <class T>
void NodoLista<T>::setInfo(T info){
    Info=info;
}

/* DefiniciÛn de la clase Lista */
template <class T>
class Lista
{
private:
    NodoLista<T> *Primero;
public:
    Lista();
    NodoLista<T> *RegresaPrimero();
    void CreaInicio();
    void CreaFinal();
    void ImprimeIterativo();
    void ImprimeRecursivo(NodoLista<T> *);
    void ImprimeUnNodo(NodoLista<T> *);
    void InsertaInicio(T);
    void InsertaFinal(T);
    void InsertaOrdenCrec(T);
    int InsertaAntes(T, T);
    int InsertaDespues(T, T);
    int EliminaPrimero();
    int EliminaUltimo();
    int EliminaUnNodo(T);
    int EliminaAnterior(T);
    int EliminaDespues(T);
    int Conta(int,NodoLista<T>*);
    NodoLista<T> *BuscaDesordenada(T);
    NodoLista<T> *BuscaOrdenada(T);
    NodoLista<T> *BuscaRecursivo(T, NodoLista<T> *);
    friend class NominaC;
};

/* DeclaraciÛn del mÈtodo constructor. Inicializa el apuntador al primer nodo
 de la lista con el valor NULL: indica la lista vacÌa. */
template <class T>
Lista<T>::Lista()
{
    Primero=NULL;
}

/* MÈtodo que regresa la direcciÛn de primer nodo de la lista. */
template <class T>
NodoLista<T> *Lista<T>::RegresaPrimero()
{
    return Primero;
}

template <class T>

int Lista<T>::Conta(int d,NodoLista<T> *Apunt){
    if (Apunt!=NULL)
    {
        
        Conta(d,Apunt->Liga);
        d++;
    }
    
    return d;
}

/* MÈtodo que crea una lista agregando el nuevo nodo al inicio de la misma. */
template <class T>
void Lista<T>::CreaInicio()
{
    NodoLista<T> *P;
    T Dato;
    char Resp;
    Primero=new NodoLista<T>();
    cout << "Introduce la informacion a almacenar: \n";
    cin >> Dato;
    Primero->Info=Dato;
    cout << "\nDeseas introducir otro elemento (S/N)? ";
    cin >> Resp;
    while (Resp == 'S' || Resp =='s')
    {
        cout << "Introduce la informacion: \n";
        cin >> Dato;
        P=new NodoLista<T>();
        P->Info=Dato;
        P->Liga=Primero;
        Primero=P;
        cout << "\nDeseas agregar otro elemento (S/N)? ";
        cin >> Resp;
    }
}

/* MÈtodo que crea una lista agregando el nuevo nodo al final de la misma. */
template <class T>
void Lista<T>::CreaFinal()
{
    NodoLista<T> *P, *Ultimo;
    T Dato;
    char Resp;
    Primero=new NodoLista<T>();
    cin >> Dato;
    Primero->Info=Dato;
    /* Se mantiene el apuntador al ˙ltimo nodo agregado a la lista para evitar
     tener que recorrerla con cada nuevo nodo. */
    Ultimo=Primero;
    cout << "\nDeseas introducir otro elemento (S/N)? ";
    cin >> Resp;
    while (Resp == 'S' || Resp =='s')
    {
        cin >> Dato;
        P=new NodoLista<T>();
        P->Info=Dato;
        Ultimo->Liga=P;
        Ultimo=P;
        cout << "\nDeseas agregar otro elemento (S/N)? ";
        cin >> Resp;
    }
}

/* MÈtodo que imprime el contenido de la lista de forma iterativa. */
template <class T>
void Lista<T>::ImprimeIterativo()
{
    NodoLista<T> *P;
    P=Primero;
    while (P)
    {
        cout << '\n'<<P->Info;
        P=P->Liga;
    }
    cout << "\n";
}

/* MÈtodo que imprime el contenido de la lista de forma recursiva. Recibe como
 par·metro el nodo cuya informaciÛn se va a imprimir. */
template <class T>
void Lista<T>::ImprimeRecursivo(NodoLista<T> *P)
{
    if (P)
    {
        cout << P->Info;
        ImprimeRecursivo(P->Liga);
    }
    cout << "\n";
}

/* MÈtodo que imprime la informaciÛn de un nodo dado como dato. */
template <class T>
void Lista<T>::ImprimeUnNodo(NodoLista<T> *P)
{
    if (P)
        cout << '\n'<<P->Info;
}

/* MÈtodo que inserta un nodo al inicio de la lista. El mÈtodo es v·lido tanto
 para listas ya creadas como para listas vacÌas. */
template <class T>
void Lista<T>::InsertaInicio(T Dato)
{
    NodoLista<T> *P;
    P=new NodoLista<T>();
    P->Info=Dato;
    P->Liga=Primero;
    Primero=P;
}

/* MÈtodo que inserta un nodo al final de la lista. El mÈtodo es v·lido tanto
 para listas ya creadas como para listas vacÌas. */
template <class T>
void Lista<T>::InsertaFinal(T Dato)
{
    NodoLista<T> *P, *Ultimo;
    P=new NodoLista<T>();
    P->Info=Dato;
    if (Primero)
    {
        /* Si la lista tiene al menos un elemento, entonces se debe recorrer
         hasta llegar al ˙ltimo nodo. */
        Ultimo=Primero;
        while (Ultimo->Liga)
            Ultimo=Ultimo->Liga;
        /* El ˙ltimo nodo de la lista apunta al nuevo nodo, cuya direcciÛn
         est· en P. */
        Ultimo->Liga=P;
    }
    else
    /* Si la lista no tiene elementos, entonces el nuevo elemento ser· el
     primero de la misma. */
        Primero=P;
}

/* MÈtodo que inserta un nodo en orden creciente. Luego de varias inserciones,
 usando este mÈtodo, se habr· generado una lista ordenada de menor a mayor. */
template <class T>
void Lista<T>::InsertaOrdenCrec(T Dato)
{
    NodoLista<T> *P, *Q, *Ant;
    if (!Primero || Primero->Info > Dato)
        InsertaInicio(Dato);
    else
    {
        Q=Primero;
        while (Q && Q->Info < Dato)
        {
            Ant=Q;
            Q=Q->Liga;
        }
        P=new NodoLista<T>();
        P->Info=Dato;
        Ant->Liga=P;
        P->Liga=Q;
    }
}

/* MÈtodo que inserta un nodo antes de un nodo dado como referencia. Recibe como
 par·metros la informaciÛn a insertar y un dato dado como referencia.
 Regresa 1 si se pudo insertar, 0 si no se encontrÛ la referencia y -1 si la
 lista est· vacÌa. */
template <class T>
int Lista<T>::InsertaAntes(T Dato, T Ref)
{
    NodoLista<T> *P, *Ant, *Q;
    int Resp=1;
    if (Primero)
    {
        Q=Primero;
        while ((Q!=NULL) && (Q->Info!=Ref))
        {
            Ant=Q;
            Q=Q->Liga;
        }
        if (Q!=NULL)
        {
            P=new NodoLista<T>();
            P->Info=Dato;
            /* El dato de referencia es el primero de la lista. */
            if (Primero==Q)
            {
                P->Liga=Primero;
                Primero=P;
            }
            else
            {
                Ant->Liga=P;
                P->Liga=Q;
            }
        }
        else
        /* No se encontrÛ el dato como referencia. */
            Resp=0;
    }
    else
    /* La lista est· vacÌa. */
        Resp=-1;
    return Resp;
}

/* MÈtodo que inserta un nodo despuÈs de uno dado como referencia. Recibe como
 par·metros la informaciÛn a insertar y la refeencia. Regresa 1 si se pudo
 insertar, 0 si no se encontrÛ el dato dado y -1 si la lista est· vacÌa. */
template <class T>
int Lista<T>::InsertaDespues(T Dato, T Ref)
{
    NodoLista<T> *Q, *P;
    int Resp=1;
    if (Primero)
    {
        Q=Primero;
        while((Q!=NULL) && (Q->Info!=Ref))
            Q=Q->Liga;
        if (Q!=NULL)
        {
            P=new NodoLista<T>();
            P->Info=Dato;
            P->Liga=Q->Liga;
            Q->Liga=P;
        }
        /* No se encontrÛ la referencia. */
        Resp=0;
    }
    else
    /* La lista est· vacÌa. */
        Resp=-1;
    return Resp;
}

/* MÈtodo que elimina el primer elemento de la lista. El mÈtodo redefine el
 apuntador al inicio de la lista y libera el espacio de memoria del nodo
 eliminado. Regresa 1 si se pudo llevar a cabo la operaciÛn y 0 en caso
 contrario. */
template <class T>
int Lista<T>::EliminaPrimero()
{
    NodoLista<T> *P;
    int Resp=1;
    if (Primero)
    {
        P=Primero;
        Primero=P->Liga;
        delete (P);
    }
    else
    /* La lista est· vacÌa. */
        Resp=0;
    return Resp;
    
}

/* MÈtodo que elimina el ˙ltimo elemento de una lista. Primero lo localiza,
 guardando la direcciÛn del nodo que le precede. Posteriormente redefine la
 liga de Èste con el valor NULL para indicar que ahora Èste es el ˙ltimo y
 libera el espacio de memoria. Regresa 1 si se efectuo la eliminaciÛn y 0
 en caso contrario. */
template <class T>
int Lista<T>::EliminaUltimo()
{
    NodoLista<T> *Ant, *P;
    int Resp=1;
    if (Primero)
    {
        /* Verifica si la lista est· formada por un ˙nico elemento, en tal caso
         redefine el apuntador al inicio con el valor NULL, indicando lista
         vacÌa. */
        if (!Primero->Liga)
        {
            delete (Primero);
            Primero=NULL;
        }
        else
        {
            P=Primero;
            while (P->Liga)
            {
                Ant=P;
                P=P->Liga;
            }
            Ant->Liga=NULL;
            delete (P);
        }
    }
    else
    /* La Lista est· vacÌa. */
        Resp=0;
    return Resp;
}

/* MÈtodo que elimina un nodo que almacena cierta informaciÛn. Recibe como
 par·metro el dato a eliminar y regresa como resultado 1 si lo elimina, 0
 si no lo encuentra y -1 si la lista est· vacÌa. */
template <class T>
int Lista<T>::EliminaUnNodo(T Ref)
{
    NodoLista<T> *P, *Ant;
    int Resp=1;
    if (Primero)
    {
        P=Primero;
        while ((P->Liga)&&(P->Info!=Ref))
        {
            Ant=P;
            P=P->Liga;
        }
        if (P->Info!=Ref)
        /* El elemento no fue encontrado. */
            Resp=0;
        else
        {
            if (Primero==P)
                Primero=P->Liga;
            else
                Ant->Liga=P->Liga;
            delete (P);
        }
    }
    else
        Resp=-1;
    return Resp;
}

/* MÈtodo que elimina el nodo anterior al nodo que almacena un dato dado como
 referencia. Regresa 1 si el nodo fue eliminado, 2 si la referencia es el
 primero, 3 si no fue encontrado y 4 si la lista est· vacÌa. */
template <class T>
int Lista<T>::EliminaAnterior(T Ref)
{
    NodoLista<T> *Q, *Ant, *P;
    int Resp=1;
    if (Primero)
    {
        if (Primero->Info==Ref)
        /* No hay nodo que preceda al proporcionado como referencia. */
            Resp=2;
        else
        {
            Q=Primero;
            Ant=Primero;
            /* Ciclo que permite encontrar la informaciÛn dada como referencia,
             guardando la direcciÛn del nodo que le precede (nodo que se
             eliminar·) y del anterior a Èste para establecer las ligas
             correspondientes. */
            while ((Q->Info!=Ref)&&(Q->Liga))
            {
                P=Ant;
                Ant=Q;
                Q=Q->Liga;
            }
            if (Q->Info!=Ref)
            /* El elemento dado como referencia no est· en la lista. */
                Resp=3;
            else
                if (Primero->Liga==Q)
                {
                    delete (Primero);
                    Primero=Q;
                }
                else
                {
                    P->Liga=Q;
                    delete (Ant);
                }
        }
    }
    else
    /* La lista est· vacÌa. */
        Resp =4;
    return Resp;
}

/* MÈtodo que busca un elemento dado como referencia en una lista desordenada.
 Regresa la direcciÛn del nodo si lo encuentra y NULL en caso contrario. */
template <class T>
NodoLista<T> *Lista<T>::BuscaDesordenada(T Ref)
{
    NodoLista<T> *Q, *Resp=NULL;
    if (Primero)
    {
        Q=Primero;
        while ((Q->Info!=Ref)&&(Q->Liga))
            Q=Q->Liga;
        /* Se verifica si el elemento dado como referencia fue encontrado en
         la lista. */
        if (Q->Info==Ref)
            Resp=Q;
    }
    return Resp;
}

/* MÈtodo que busca un elemento dado como referencia, en una lista ordenada
 de menor a mayor. Regresa la direcciÛn del nodo si lo encuentra y NULL en
 caso contrario. */
template <class T>
NodoLista<T> *Lista<T>::BuscaOrdenada(T Ref)
{
    NodoLista<T> *Q, *Resp=NULL;
    if (Primero)
    {
        Q=Primero;
        while ((Q->Info < Ref)&&(Q->Liga))
            Q=Q->Liga;
        /* Se verifica si el elemento dado como referencia fue encontrado en
         la lista. */
        if (Q->Info==Ref)
            Resp=Q;
    }
    return Resp;
}

/* MÈtodo que busca un dato en la lista. La operaciÛn se realiza recursivamente.
 El mÈtodo recibe como par·metro el elemento a buscar (Dato) y una variable
 (Q) que almacena la direcciÛn de un nodo (la primera vez es la direcciÛn
 del primero). Regresa como resultado la direcciÛn del nodo si lo encuentra
 y NULL en caso contrario. */
template <class T>
NodoLista<T> *Lista<T>::BuscaRecursivo(T Dato, NodoLista<T> *Q)
{
    if (Q)
        if (Q->Info==Dato)
            return Q;
        else
            return BuscaRecursivo(Dato, Q->Liga);
        else
            return NULL;
}


char aux[2];

class Empleado{
    
protected:
    string Nombre="";
    int ID=0;
    int Departamento=0;
    int Nivel=0;
    int Antiguedad=0;
    int TipoContrato=0;
    int DiasTrabajados=0;
    int HorasExtra=0;
    double Salario=0;
    double Bonos=0;
    double Descuentos=0;
    friend class NominaC;
    
public:
    
    Empleado(){ }
    Empleado(string N, int I, int D, int Ni, int A, int TC, double S, int DT, int HE, double B, double De){
        setNombre(N);
        setID(I);
        setDepartamento(D);
        setNivel(Ni);
        setAntiguedad(A);
        setTipoContrato(TC);
        setSalario(S);
        setDiasTrabajados(DT);
        setHorasExtra(HE);
        setBonos(B);
        setDescuentos(De);
    }
    
    string getNombre(){ return Nombre; }
    void setNombre(string Nom){ Nombre=Nom; }
    
    int getID(){ return ID; }
    void setID(int id){ ID=id; }
    
    int getDepartamento(){ return Departamento; }
    void setDepartamento(int Dep){ Departamento=Dep; }
    
    int getNivel(){ return Nivel; }
    void setNivel(int Ni){ Nivel=Ni; }
    
    int getAntiguedad(){ return Antiguedad; }
    void setAntiguedad(int An){ Antiguedad=An; }
    
    int getTipoContrato(){ return TipoContrato; }
    void setTipoContrato(int TiC){ TipoContrato=TiC; }
    
    int getHorasExtra(){ return HorasExtra; }
    void setHorasExtra(int HoE){ HorasExtra=HoE; }
    
    double getSalario(){ return Salario; }
    void setSalario(double Sa){ Salario=Sa; }
    
    int getDiasTrabajados(){ return DiasTrabajados; }
    void setDiasTrabajados(int DiT){ DiasTrabajados=DiT; }
    
    double getBonos(){ return Bonos; }
    void setBonos(double Bon){ Bonos=Bon; }
    
    double getDescuentos(){ return Descuentos; }
    void setDescuentos(double Des){ Descuentos=Des; }
    
    
    void CalculaSalario(){
        
        switch (Departamento) {
            case 1:
                switch (Nivel) {
                    case 1:
                        Salario=N1*1.2;
                        break;
                    case 2:
                        Salario=N2*1.2;
                        break;
                    case 3:
                        Salario=N3*1.2;
                        break;
                    case 4:
                        Salario=N4*1.2;
                        break;
                    case 5:
                        Salario=N5*1.2;
                        break;
                    default:
                        break;
                }
                break;
                
            default:
                break;
        }
        
    }
    
    void setSalario(double Bonos, double Descuentos, int HorasExtra, int DiasTrab){
        Salario=(((Salario/12)*DiasTrab)+(HorasExtra*30)+Bonos-Descuentos);
    }
    
    
    /* MÈtodo que permite comparar dos objetos de tipo Producto para determinar si
     son iguales. Regresa 1 si los productos son iguales (tienen la misma clave)
     y 0 en caso contrario. Se usa sobrecarga del operador ==. */
    int operator == (Empleado E)
    {
        int Resp=0;
        if (ID==E.ID)
            Resp=1;
        return Resp;
    }
    
    /* MÈtodo que permite comparar dos objetos de tipo Producto para determinar si
     son distintos. Regresa 1 si los productos son distintos (tienen diferente
     clave) y 0 en caso contrario. Se usa sobrecarga del operador !=. */
    int operator != (Empleado E)
    {
        int Resp=0;
        if (ID!=E.ID)
            Resp=1;
        return Resp;
    }
    
    
    /* MÈtodo que permite comparar dos objetos de tipo Producto para determinar si
     el asociado al operador es mayor que el dado como par·metro. Regresa 1
     cuando es mayor (su clave es mayor que la clave del dado como par·metro)
     y 0 en caso contrario. Se usa sobrecarga del operador >, */
    int operator > (Empleado E)
    {
        int Resp=0;
        if (ID > E.ID)
            Resp=1;
        return Resp;
    }
    
    /* MÈtodo que permite comparar dos objetos de tipo Producto para determinar si
     el asociado al operador es menor que el dado como par·metro. Regres 1 cuando
     es menor (su clave es menor que la clave del dado como par·metro) y 0 en
     caso contrario. Se usa sobrecarga del operador <. */
    int operator < (Empleado E)
    {
        int Resp=0;
        if (ID < E.ID)
            Resp=1;
        return Resp;
    }
    
    friend istream &operator>>(istream &, Empleado &);
    friend ostream &operator<<(ostream &, Empleado &);
    
};

ostream &operator<<(ostream &Imprime, Empleado &E) {
    
    Imprime<<E.getID()<<setw(30)<<E.getNombre()<<setw(18)<<E.getDepartamento()<<setw(6)<<E.getNivel()<<
    setw(7)<<E.getAntiguedad()<<setw(14)<<E.getTipoContrato()<<setw(10)<<E.getSalario()<<setw(12)<<E.getDiasTrabajados()<<setw(7)<<E.getHorasExtra()<<setw(7)<<E.getBonos()<<setw(7)<<E.getDescuentos();
    
    return Imprime;
}

istream &operator>>(istream &Escribe, Empleado &E){
    int datoint;
    char aux[2];
    string datostr;
    cout<<endl;
    cout<<"ID: ";
    cin>>datoint;
    E.setID(datoint);
    cin.getline(aux, 2);
    cout<<"Nombre: ";
    getline(cin, datostr);
    E.setNombre(datostr);
    cout<<"Departamento: ";
    cin>>datoint;
    E.setDepartamento(datoint);
    cout<<"Nivel: ";
    cin>>datoint;
    E.setNivel(datoint);
    cout<<"Antigüedad: ";
    cin>>datoint;
    E.setAntiguedad(datoint);
    cout<<"Tipo de contrato: ";
    cin>>datoint;
    E.setTipoContrato(datoint);
    cout<<endl;
    E.CalculaSalario();
    
    return Escribe;
}


Código:
#include <iostream>
#include <string>
#include <iomanip>
#include "Empleado.h"
#include "stdlib.h"
#include <fstream>
#define N1 1750
#define N2 1100
#define N3 750
#define N4 390
#define N5 240

using namespace std;

class NominaC{
    Lista<Empleado> N;
    NodoLista<Empleado> Auxi,*Auxi2;
    int NumeroEmpleados=0;
public:
    
    void CargarArchivo(){
        int a;
        string Nombre;
        int ID;
        int Departamento;
        int Nivel;
        int Antiguedad;
        int TipoContrato;
        int DiasTrabajados;
        int HorasExtra;
        double Salario;
        double Bonos;
        double Descuentos;
        NodoLista<Empleado> *Auxiliar=N.RegresaPrimero();
        Empleado A;
        ifstream cargar;
        cargar.open("numero.txt",ios::in);
        cargar>>NumeroEmpleados;
        cargar.close();
        cargar.open("datos.txt",ios::in);
            while(Auxiliar){
            cargar>>ID>>Nombre>>Departamento>>Nivel>>Antiguedad>>TipoContrato>>DiasTrabajados>>HorasExtra>>Salario>>Bonos>>Descuentos;
                A.setID(ID);
                A.setNombre(Nombre);
                A.setDepartamento(Departamento);
                A.setNivel(Nivel);
                A.setAntiguedad(Antiguedad);
                A.setTipoContrato(TipoContrato);
                A.setDiasTrabajados(DiasTrabajados);
                A.setHorasExtra(HorasExtra);
                A.setSalario(Salario);
                A.setBonos(Bonos);
                A.setDescuentos(Descuentos);
                N.InsertaOrdenCrec(A);
                Auxiliar->setInfo(A);
                Auxiliar=Auxiliar->RegresaLiga();
                
            }
            
        
        
        cargar.close();
    }
    
    void guardarElemento(){
        NodoLista<Empleado> *Auxiliar;
        Empleado A;
        ofstream guardar;
        guardar.open("numero.txt",ios::out);
        guardar<<NumeroEmpleados;
        guardar.close();
        guardar.open("datos.txt",ios::out);
            while(Auxiliar){
                A=Auxiliar->RegresaInfo();
            guardar<<A.getID()<<"     "<<A.getNombre()<<"     "<<A.getDepartamento()<<"     "<<A.getNivel()<<"     "<<A.getAntiguedad()<<"     "
                <<A.getTipoContrato()<<"     "<<A.getDiasTrabajados()<<"     "<<A.getHorasExtra()<<"     "<<A.getSalario()<<"     "<<A.getBonos()
                <<"     "<<A.getDescuentos()<<endl;
                Auxiliar=Auxiliar->RegresaLiga();
        
        guardar.close();
    }
    }
    
    void AgregarEmpleado(){
        Empleado A;
        cin>>A;
        N.InsertaOrdenCrec(A);
        NumeroEmpleados++;
        guardarElemento();
    }
    
    void EliminarEmpleado(){
        int id,res;
        cout<<"ID del empleado: ";
        cin>>id;
        Empleado X(" ", id, 0, 0, 0, 0, 0, 0,0,0,0);
        res=N.EliminaUnNodo(X);
        switch (res)
        {
            case 1:  cout << "El empleado ha sido eliminado.\n";
                NumeroEmpleados--;
                break;
            case 0:  cout << "El ID no esta registrado.\n";
                break;
            case -1: cout << "No hay empleados registrados.\n";
                break;
        }
    }
    
    void EditarEmpleado(){
        int id,dato;
        cout<<"ID del empleado: ";
        cin>>id;
        Empleado X(" ", id, 0, 0, 0, 0, 0, 0,0,0,0),A;
        if(N.BuscaOrdenada(X)){
            Auxi=*N.BuscaOrdenada(X);
            A=Auxi.RegresaInfo();
            N.EliminaUnNodo(X);
            int cambio;
            cout<<"¿Qué dato deseas editar?\n(1) Departamento.\n(2) Nivel.\n(3) Antigüedad.\n(4) Tipo de Contrato.\nOpción: ";
            cin>>cambio;
            switch (cambio) {
                case 1:
                {
                    cout<<"Nuevo departamento: ";
                    cin>>dato;
                    A.setDepartamento(dato);
                    A.CalculaSalario();
                    N.InsertaOrdenCrec(A);
                    Auxi2=N.BuscaOrdenada(A);
                    N.ImprimeUnNodo(Auxi2);
                    break;
                }
                case 2:
                {
                    cout<<"Nuevo nivel: ";
                    cin>>dato;
                    A.setNivel(dato);
                    A.CalculaSalario();
                    N.InsertaOrdenCrec(A);
                    Auxi2=N.BuscaOrdenada(A);
                    N.ImprimeUnNodo(Auxi2);
                    break;
                }
                case 3:
                {
                    cout<<"Nueva antigüedad: ";
                    cin>>dato;
                    A.setAntiguedad(dato);
                    N.InsertaOrdenCrec(A);
                    Auxi2=N.BuscaOrdenada(A);
                    N.ImprimeUnNodo(Auxi2);
                    break;
                }
                case 4:
                {
                    cout<<"Nuevo tipo de contrato: ";
                    cin>>dato;
                    A.setTipoContrato(dato);
                    N.InsertaOrdenCrec(A);
                    Auxi2=N.BuscaOrdenada(A);
                    N.ImprimeUnNodo(Auxi2);
                    break;
                }
                default:
                    break;
            }
        }
        
    }
    
    void MostrarEmpleados(){
        cout<<"ID"<<setw(18)<<"|NOMBRE"<<setw(40)<<"|DEP."<<setw(7)<<"|NIVEL"<<setw(8)<<"|ANTIG."<<setw(10)<<
        "|CONTRATO"<<setw(14)<<"|SALARIO BASE"<<setw(10)<<"|D. TRAB."<<setw(12)<<"|HRS. EXTRA"<<setw(7)<<"|BONOS"<<setw(7)<<
        "|DESC.";
        N.ImprimeIterativo();
    }
    
    void MostrarUnEmpleado(){
        cout<<"ID del empleado: ";
        int id;
        cin>>id;
        Empleado M(" ",id,0,0,0,0,0,0,0,0,0);
        Auxi2=N.BuscaOrdenada(M);
        N.ImprimeUnNodo(Auxi2);
    }
    
    void CrearNomina(){
        NodoLista<Empleado> *Auxiliar=N.RegresaPrimero(),*Auxi2,*A3,*A4;
        Empleado A,B; int DT, HE; double Bonos, Descuentos;
        while (Auxiliar) {
            A=Auxiliar->RegresaInfo();
            Auxi2=N.BuscaOrdenada(A);
            N.ImprimeUnNodo(Auxi2);
            cout<<"Número de días trabajados: ";
            cin>>DT;
            A.setDiasTrabajados(DT);
            cout<<"Número de horas extra: ";
            cin>>HE;
            A.setHorasExtra(HE);
            cout<<"Bonos: ";
            cin>>Bonos;
            A.setBonos(Bonos);
            cout<<"Descuentos: ";
            cin>>Descuentos;
            A.setDescuentos(Descuentos);
            A.setSalario(Bonos, Descuentos, HE, DT);
            //A.CalculaSalario();
            Auxiliar->setInfo(A);
            Auxiliar=Auxiliar->RegresaLiga();
        }
        A3=N.RegresaPrimero();
        while (A3) {
            B=A3->RegresaInfo();
            A4=N.BuscaOrdenada(B);
            N.ImprimeUnNodo(A4);
            A3=A3->RegresaLiga();
        }
        
    }
    
};



void Menu(){
    
    cout<<"(1) Agregar empleado.\n(2) Eliminar empleado.\n(3) Editar información de empleado.\n(4) Mostrar empleados.\n(5) Mostrar un empleado.\n(6) Crear nómina.\n(7) Salir.\nOpción: ";
    
}


int main() {
    
    //Lista<Empleado> Nomina;
    //Empleado Aux;
    //NodoLista<Empleado> Auxi,*Auxi2;
    NominaC N;
    N.CargarArchivo();
    int Opcion;
    
    do {
        cout<<"\n\t\tSISTEMA DE GESTIÓN DE USUARIOS\n";
        Menu();
        cin>>Opcion;
        switch (Opcion) {
            case 1:
            {
                N.AgregarEmpleado();
                N.guardarElemento();
                break;
            }
            case 2:
            {
                N.EliminarEmpleado();
                N.guardarElemento();
                break;
            }
            case 3:
            {
                N.EditarEmpleado();
                N.guardarElemento();
                break;
            }
            case 4:
            {
                N.MostrarEmpleados();
                break;
            }
            case 5:
            {
                N.MostrarUnEmpleado();
                break;
            }
            case 6:
            {
                N.CrearNomina();
                N.guardarElemento();
                break;
            }
            case 7:
            {
                cout<<"Hasta pronto.\n\n";
                break;
            }
            default:
                cout<<"Opción inválida\n\n";
                break;
                
        }
    } while (Opcion!=7);
    
    N.guardarElemento();
    
    return 0;
    
}


« Última modificación: 22 Abril 2016, 05:16 am por EdsonGuizar » En línea

ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: Guardar Información de una lista ligada en un archivo .txt
« Respuesta #1 en: 22 Abril 2016, 09:45 am »

Te pongo yo un código de 1000 líneas, y me quedo tan ancho.

Lo que debes hacer, es ir probando cada fragmento de código por separado y asegurándote de que funciona a la perfección.


En línea

AlbertoBSD
Programador y
Moderador Global
***
Desconectado Desconectado

Mensajes: 3.696


🏴 Libertad!!!!!


Ver Perfil WWW
Re: Guardar Información de una lista ligada en un archivo .txt
« Respuesta #2 en: 23 Abril 2016, 13:39 pm »

El problema de Guardar los datos es la eleccion del formarto lo que podria ser en Forma Binaria o en texto plano. Una vez elegido esto tambien tendremos que elegir si cada registro tiene longitud fija o longitud variable.

Tiens que elegir un formato y apegarte a el.

Nunca me a gustado la forma en la que trabaja C++ para sacar loa datos a archvos y darles entrada ( <<, >> )

Yo en lo personal prefiero guardar una estrutura fija con fwrite y leerla con fread ( Forma Binaria)

o si voy a trabajar con texto plano seria mediante una estrutura tipo CSV registros separados por lineas, campos separados por comas y cadenas entre comillas.

en tu código veo que usas dos archivos y ademas esos espacios separando los campos,  al momento de leer loa datos no veo que se haga un chequeo del archivo que pasa si un dato no fue ingresado?

Código:
guardar.open("numero.txt",ios::out);
        guardar<<NumeroEmpleados;
        guardar.close();
        guardar.open("datos.txt",ios::out);
            while(Auxiliar){
                A=Auxiliar->RegresaInfo();
            guardar<<A.getID()<<"     "<<A.getNombre()<<"     "<<A.getDepartamento()<<"     "<<A.getNivel()<<"     "<<A.getAntiguedad()<<"     "
                <<A.getTipoContrato()<<"     "<<A.getDiasTrabajados()<<"     "<<A.getHorasExtra()<<"     "<<A.getSalario()<<"     "<<A.getBonos()
                <<"     "<<A.getDescuentos()<<endl;
                Auxiliar=Auxiliar->RegresaLiga();
        
        guardar.close();
« Última modificación: 23 Abril 2016, 13:46 pm por AlbertoBSD » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Se puede guardar informacion que no sea en un archivo con .NET ?
.NET (C#, VB.NET, ASP)
nico56 7 5,109 Último mensaje 31 Enero 2010, 01:14 am
por nico56
[Solucionado] Ayuda con Lista Ligada
.NET (C#, VB.NET, ASP)
DaNuK 8 5,612 Último mensaje 22 Octubre 2010, 20:43 pm
por DaNuK
Lista doblemente ligada
Programación C/C++
m@o_614 1 2,162 Último mensaje 18 Noviembre 2013, 17:13 pm
por rir3760
Una lista Doblemente Ligada con una lista ligada cuando un numero se repite
Programación C/C++
Gatoloco123 0 2,023 Último mensaje 20 Octubre 2017, 03:36 am
por Gatoloco123
Guardar Lista Enlazada en Archivo Binario
Programación C/C++
mari2diaz 2 4,252 Último mensaje 4 Abril 2018, 05:42 am
por mari2diaz
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines