Ayuda con Directorio en c++

Iniciado por Gunhack, 1 Junio 2015, 04:04 AM

0 Miembros y 1 Visitante están viendo este tema.

Gunhack

Hola buenas! Tengo problemas con este código, estoy leyendo un libro "Estructura de datos con C++" viene un ejercicio de crear un directorio apartir de un archivo de texto, viene el codigo y solamente lo estoy copiando, el problema está (creo) al asignar la memoria no sé como arreglarlo, ojalá puedan decirme que está mal :C gracias!

Directory-Entry.h
Código (cpp) [Seleccionar]

#include <iostream>

using namespace std;

class Entrada_Directorio{
public:
 Entrada_Directorio(string _Nombre, string _Numero) : Nombre(_Nombre), Numero(_Numero){}
 Entrada_Directorio(){}
 string dar_Nombre() const {return Nombre;}
 string dar_Numero() const {return Numero;}
 void mod_Numero(const string &nuevo_Numero) {Numero=nuevo_Numero;}
private:
 string Nombre;
 string Numero;
};



Arreglo_PD.h
Código (cpp) [Seleccionar]

#include <string>
#include "Directory-Entry.h"

using namespace std;

class Directorio_Tel{
public:
 Directorio_Tel(){} // Cuando lo pongo como  Directorio_Tel(); me da error al crear el objeto
 ~Directorio_Tel(){}

 void cargar_datos(const string &nombre_arch);
 string buscar_nom(const string &Nombre) const;
 string anadir_modif(const string &Nombre, string &Numero);
 string eliminar(const string &Nombre);
 void guardar();
 friend ostream& operator<<(ostream &os, const Directorio_Tel &Tel);
private:
 int buscar(const string &Nombre) const;
 void agregar(const string &Nombre, string &Numero);
 void eliminar(int num);
 void realocar();
 int tamano;
 int capacidad;
 Entrada_Directorio* Directorio;
 string nombre_arch;
 bool modificado;
};


Arreglo_PD.cpp
Código (cpp) [Seleccionar]

#include "Arreglo_PD.h"
#include <fstream>
#include <conio.h>

using namespace std;

void Directorio_Tel::cargar_datos(const string &nombre_arch){
 this->nombre_arch=nombre_arch;
 ifstream in(nombre_arch.c_str());
 if (in){
   string Nombre;
   string Numero;
   while (getline(in,Nombre,'\n')){
     if (getline(in,Numero,'\n')){
       cout<<Nombre<<endl;
       cout <<Numero<<endl; //Coloqué esto para ver como se van agregando los nombres...
       agregar(Nombre, Numero); //Desde aqui todo bien al mandar a llamar esta funcion
     }
   }
   in.close();//No entiendo como es que (según el libro) esto logra cargar todo el archivo...
 }
}

string Directorio_Tel::buscar_nom(const string &Nombre) const {
 int num=buscar(Nombre);
 if(num!=-1){
   return Directorio[num].dar_Numero();
 } else {
   return "";
 }
}

string Directorio_Tel::anadir_modif(const string &Nombre, string &Numero) {
 string numero_ant="";
 int num=buscar(Nombre);
 if(num!=-1){
   numero_ant=Directorio[num].dar_Numero();
   Directorio[num].mod_Numero(Numero);
 }
 modificado=true;
 return numero_ant;
}

string Directorio_Tel::eliminar(const string &Nombre){
;
}

void Directorio_Tel::guardar() {
 if (modificado){
   ofstream out(nombre_arch.c_str());
   for(int i=0; i<tamano; i++){
     out << Directorio[i].dar_Nombre() <<endl;
     out << Directorio[i].dar_Numero() <<endl;
   }
   out.close();
   modificado=false;
 }
}

int Directorio_Tel::buscar(const string &Nombre) const {
 for(int i=0; i<tamano; i++){
   if (Directorio[i].dar_Nombre()==Nombre)
     return 1;
 }
 return -1;
}

void Directorio_Tel::agregar(const string &Nombre, string &Numero) {
 if(tamano==capacidad)
   realocar(); //Aquí llama a la función erronea
 Directorio[tamano]=Entrada_Directorio(Nombre,Numero);
 tamano++;
}

void Directorio_Tel::eliminar(int num) {
;
}

//Esta es la funcion que da error
void Directorio_Tel::realocar() {
 capacidad*=2;
 Entrada_Directorio* nuevo_Directorio=new Entrada_Directorio[capacidad];
 getch(); //Este getch lo puse por que después de aquí se hace el error
 for(int i=0; i<tamano; i++){
   nuevo_Directorio[i]=Directorio[i];
 }
 delete[] Directorio;
 Directorio=nuevo_Directorio;
}

ostream& operator<<(ostream &os, const Directorio_Tel &Tel) {
 for(int i=0; i<Tel.tamano; i++){
   os<<Tel.Directorio[i].dar_Nombre()<<endl;
   os<<Tel.Directorio[i].dar_Numero()<<endl<<endl;
 }
 return os;
}


main()...
Código (cpp) [Seleccionar]

#include <iostream>
#include "Arreglo_PD.h"

using namespace std;

int main(){
 Directorio_Tel D1;
 D1.cargar_datos("Directorio.txt");
 cout << D1;
}



Nota: Crear el archivo de texto xD De antemano muchas gracias y espero que puedan ayudarme!  :(

Gunhack

Me respondo a mi mismo  :rolleyes:
Tenia que inicializar esta parte aunque en el libro no lo decía xD
Código (cpp) [Seleccionar]

class Directorio_Tel{
public:
  Directorio_Tel():capacidad(0),tamano(0){}
  ~Directorio_Tel(){}


Acá tuve que modificar esto pero no se si esté bien lo que hago, el punto es que funciona  :xD
Código (cpp) [Seleccionar]

void Directorio_Tel::realocar() {

  if(capacidad==0){
    capacidad+=1;
    Directorio=new Entrada_Directorio[capacidad];
  }
  capacidad*=2;

  Entrada_Directorio* nuevo_Directorio=new Entrada_Directorio[capacidad];
  for(int i=0; i<tamano; i++){
    nuevo_Directorio[i]=Directorio[i];
  }
  delete[] Directorio;
  Directorio=nuevo_Directorio;
}



Saludos y gracias :-\