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:
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:
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
No he mirado todo tu código, solo la última parte pero... Deberías no cerrar el archivo dentro del while().
Saca el:
archivo.close();
fuera del while() de esta manera:
while(aux != NULL){
archivo << aux;
aux = aux->sigue;
}
archivo.close();
y dime si te funcionó.
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!
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++...
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
while(aux != NULL){
archivo << aux;
aux = aux->sigue;
}
archivo.close();
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
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!!
Yo lo he probado y me ha guardado todo correctamente. El siguiente código debería funcionar:
Nodo *aux = superior;
while(aux != NULL){
archivo << aux->indice.id << " | " << aux->indice.NumeroCompras << endl;
aux = aux->sigue;
}
Cómo has sobrecargado el operador <<??
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:
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!
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.
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:
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 :(
Como ya te he dicho, una forma fácil aunque poco eficiente es que uses una estructura como la siguiente:
struct Elemento {
char valor;
int repeticiones;
};
El algoritmo sería el siguiente. Ahora es trabajo tuyo entenderlo y traducirlo al lenguaje que quieras ya sea C o C++.
caracteres : array de char
elementos : array de Elemento
PARA i := 0 HASTA length(caracteres)-1 INCREMENTO 2 HACER
indice = buscar(caracteres[i], elementos)
SI indice < 0 ENTONCES
agregar(caracteres[i], elementos)
SINO
incrementar(elementos[indice])
FIN SI
FIN PARA
ordenar(elementos) // en base al numero de repeticiones
PARA i := 0 HASTA length(elementos) - 1 INCREMENTO 1 HACER
PARA j := 1 HASTA elementos[i].repeticiones INCREMENTO 1 HACER
insertar(caracteres, elementos[i].valor)
FIN PARA
FIN PARA