¿Como guardar datos de pila en un archivo de texto?

Iniciado por LuisUvtol, 2 Mayo 2020, 01:49 AM

0 Miembros y 3 Visitantes están viendo este tema.

LuisUvtol

Buen dia a todos los internautas, tengo un pequeño problema, quiero guardar mis datos a un archivo de texto pero no logro hacerlo el codigo es el siguiente:

Mis estructuras:
[code=cpp]struct frecuenciaCompras{
char id[100];
int NumeroCompras;
};

struct Nodo{
struct frecuenciaCompras indice;
struct Nodo *sigue;
};
[/code]

mis funciones para agregar:

Código (cpp) [Seleccionar]
void agregar(struct frecuenciaCompras indice){
  struct Nodo *agregaNodo = (Nodo*)malloc(sizeof(struct Nodo));
  agregaNodo->indice = indice;
  agregaNodo->sigue = superior;
  superior = agregaNodo;
}
void agregarLista(char id[100]){
struct Nodo *aux = superior;
while (aux != NULL){
int buscafrecuencia = strcasecmp(aux->indice.id, id);
if(buscafrecuencia==0){
aux->indice.NumeroCompras++;
return;
}
aux = aux->sigue;
}
struct frecuenciaCompras indice;
strcpy(indice.id, id);
indice.NumeroCompras = 1;
agregar(indice);
}

El problema lo tengo en mi funcion guardar ya que solo me guarda la direccion de memoria de 1 dato, no de n datos:
Código (cpp) [Seleccionar]
void guardar(){
ofstream archivo;
char guiones[] = "--------------------";
archivo.open("BaseDatos.txt",ios::app);
if(archivo.fail()){
cout<<"No se pudo abrir";
exit(1);
}

struct Nodo *aux = superior;
while(aux != NULL){                     //En esta parte deberia de guardarse los datos de mi aux
archivo<<aux;
aux = aux->sigue;
archivo.close();
}

}

Espero y puedan ayudarme, les agradezco

K-YreX

No he mirado todo tu código, solo la última parte pero... Deberías no cerrar el archivo dentro del while().
Saca el:
Código (cpp) [Seleccionar]
archivo.close();
fuera del while() de esta manera:
Código (cpp) [Seleccionar]

while(aux != NULL){
  archivo << aux;
  aux = aux->sigue;
}
archivo.close();

y dime si te funcionó.
Código (cpp) [Seleccionar]

cout << "Todos tenemos un defecto, un error en nuestro código" << endl;

LuisUvtol

Gracias por tu respuesta! realice las modificaciones que me dijiste y el resultado es el siguiente:

1. Tengo una pila con los siguientes datos:

ID |Frecuencia
2  |   2
3  |   2
4  |   1
5  |   3

Lo unico que se me guarda en el archivo es lo siguiente:
ID | Frecuencia
2   | 2

ahorita estoy trabajando para que se me guarde todo y por supuesto, si lo logro compartire el codigo en este hilo
si me puedes ayudar con esto estaría muy agradecido!

K-YreX

Primero comprueba que los datos se guardan correctamente en la pila. Si es así, ahora comprueba que no estés sobrescribiendo la primera línea de tu fichero ya que al ser una pila, se ve que solo muestra el primer valor insertado que es el último en salir.

PD: El código es bastante mejorable. Hay una mezcla de C con C++...
Código (cpp) [Seleccionar]

cout << "Todos tenemos un defecto, un error en nuestro código" << endl;

LuisUvtol

Los datos se guardan correctamente en la pila, encontre una manera de guardar los datos pero no es eficiente, deberia emplear un bucle pero no se como implementarlo
Código (cpp) [Seleccionar]
while(aux != NULL){
  archivo << aux;
  aux = aux->sigue;

}
archivo.close();

LuisUvtol

Los datos se guardan correctamente en la pila, encontre una manera de guardar los datos pero no es eficiente, deberia emplear un bucle pero no se como implementarlo
Código (cpp) [Seleccionar]
while(aux != NULL){
  archivo << aux;
  aux = aux->sigue;
  archivo<<aux->sigue->indice.id;
  archivo<<aux->sigue->sigue->indice.id;
  archivo<<aux->sigue->sigue->sigue->indice.id;
}
archivo.close();

de esta manera si me guarda los datos en el archivo, he estado intentando usar un bucle ¿Alguna idea para implementarlo?
Gracias!!

K-YreX

Yo lo he probado y me ha guardado todo correctamente. El siguiente código debería funcionar:
Código (cpp) [Seleccionar]

Nodo *aux = superior;
while(aux != NULL){
  archivo << aux->indice.id << " | " << aux->indice.NumeroCompras << endl;
  aux = aux->sigue;
}

Cómo has sobrecargado el operador <<??
Código (cpp) [Seleccionar]

cout << "Todos tenemos un defecto, un error en nuestro código" << endl;

LuisUvtol

Me ha funcionado! Muchas gracias, estoy por terminar mi codigo, pero quiero hacer una ultima modoficacion, tal vez me puedas ayudar, ¿Como puedo ordenar una variable tipo char? por ejemplo:
Código (cpp) [Seleccionar]

char ejemplo[] = "1,1,2,3,3,3,4,4,5,5,5,5,6,7";

Quisera ordenarla de esta manera:
ejemplo[] = "5,5,5,5,3,3,3,4,4,1,1,6,7"

Quiero ordenarla dependiendo de la frecuencia de los numeros, Gracias!

K-YreX

Hay muchas formas de hacerlo y dependerán de las funciones, las estructuras,... que quieras usar. Básicamente dependerá de tu algoritmo.
También tendrás que tener en cuenta ciertas precondiciones como si conoces la cantidad de dígitos diferentes existentes o si todos los dígitos iguales aparecerán seguidos,...
Puedes usar una estructura para guardar un valor y sus repeticiones. Crear un array de esta estructura y guardar todos los valores, ordenar dicho array y después crear la nueva cadena a partir de esos resultados.
Puedes usar una cola con prioridad (puedes usar la de la STL de C++). Y es altamente recomendable no solo para esto sino para todos tus programas que tengas en claro tu lenguaje de programación. En C++ no se usa malloc/free sino new/delete. Tienes los strings para facilitarte el trabajo con cadenas y tienes las clases en vez de las estructuras.
Código (cpp) [Seleccionar]

cout << "Todos tenemos un defecto, un error en nuestro código" << endl;

LuisUvtol

Gracias por tu respuesta! Lo que yo busco hacer es ordenar esa cadena, dependiendo de las repeticiones y que se me genere una nuevo char, ya con este nuevo char modifico mi codigo para poder trabajar con el, puedo ordenar el char de manera ascencente con el siguiente codigo:
Código (cpp) [Seleccionar]

int main(){
int i,j,k;
char a[50],aux;

for(i=0;(a[i]=getchar())!='\n';i++){

for(k=0;k<i;k++){
for(j=1;j<i;j++){
if(a[j]<a[j-1]){
aux=a[j];
a[j]=a[j-1];
a[j-1]=aux;
}
}
}
}
for(j=0;j<i;j++){
printf("%c",a[j]);
}

Pero no lo logro ordenar por frecuencia :(