Título: guardar nodos en txt Publicado por: d91 en 17 Abril 2014, 19:21 pm hola a todos, estoy haciendo mi proyecto final con programacion orientado a objetos pero no he encontrado algun tutorial de estructura de datos con archivos, pero he intentado ingeniarmelas, usando una cola dinamica para los pacientes que llegan a una clinica, he trabajado con archivos pero con estructuras no con clases aunque al parecer la diferencia es que las estructuras no tienen metodos, constructores y destructores y como son dinamicas aumenta la dificultad, se muy bien que en este codigo estoy alternando c y c++ pero lo que es archivos se me es mas facil en c. Entonces mi dificultad es como guardar una cola dinamica en txt y despues volver a cargarla, hice algunos procedimientos para guardar pero no se si esta bien aqui el codigo
Código
Título: Re: guardar nodos en txt Publicado por: eferion en 21 Abril 2014, 10:17 am Nota 1.
Una lista enlazada es, por definición, dinámica... luego la dificultad es siempre la misma. No? Nota 2. Estás trabajando con C++, luego no termino de entender por qué el nombre lo almacenas con un array de chars en vez de usar la clase string. Código
Nota 3. No tiene sentido que pongas includes de C... los includes de C++ no llevan la extensión .h. La STL es suficientemente amplia y completa, no necesitas los includes de C para nada. Nota 4. Por qué motivo cola es clase friend de nodo??? Es mucho mejor que pongas los getters y setters correspondientes en nodo... pocas veces es necesario usar friend y este no es el caso ( además puede ser una fuente de problemas ). Código
Nota 5. Código
Ya que usas un typedef... por qué no lo pones al principio y lo usas también en "nodo"?? Yo personalmente no soy partidario de usar alias para ahorrarte un asterisco... bueno, no te lo ahorras, lo cambias por una "p"... pero si lo usas, al menos intenta aprovecharlo al máximo: Código
Nota 6. Código
No solo es muy mala idea usar variables globales sino que, además, la has metido entre medias de la implementación de "cola"... mi consejo es no usar variables globales, pero si las usas, al menos que estén en sitios concretos y correctamente identificadas. Nota 7. Como te comenté al principio, la STL tiene una colección bastante decente y completa de utilidades que te permiten "olvidar" las viejas funciones de C. En el caso de acceso y manipulación de ficheros, tienes las clases ostream e istream ( y sus derivadas ) que simplifican la gestión de ficheros. Además vienen con opciones especiales para poder trabajar con clases nativas de C++, como la clase string. Nota 8. A la hora de guardar clases en ficheros no es buena idea guardar la clase "a pelo" volcando su memoria al fichero. La razón es que en ese volcado puede viajar información RTTI ( la que se usa en dynamic_cast y que gestiona la herencia )... y no creo que quieras exportar eso porque puedes tener problemas si cambia la estructura de las clases. La forma correcta de trabajar es guardar las cosas miembro a miembro. Lo mejor es crear una clase que sepa como "serializar" cada elemento "nodo" para almacenar / recuperar un nodo a partir de un archivo. Por supuesto, lo que no puedes hacer es volcar el contenido de la cola literalmente... la cola almacena punteros... y lo que vas a almacenar en el fichero es el valor de los punteros, no el contenido apuntado por dichos punteros... Nota 9. Yo soy partidario de seguir la norma "1 clase = 1 responsabilidad"... simplifica el diseño, evita dependencias absurdas y facilita la depuración y el mantenimiento. En tu caso, "cola" tiene 2 responsabilidades. Por un lado gestiona una lista de nodos y, por otra, permite volcar dichos nodos a la salida estándar... Yo habría optado por quitar esta segunda responsabilidad de "cola" y la habría puesto o bien en una clase creada para la ocasión o bien en una función independiente. No hay que tener miedo a tener decenas de clases sencillas... al contrario de la creencia popular entre los que van aprendiendo, tener clases sencillas facilita muchísimo el proceso de crear software... es como usar piezas de Lego... Si caes en la tentación de juntar múltiples responsabilidades en una sola clase o función al final acabarás gestionando clases gigantescas las cuales te van a devorar al intentar hacer modificaciones o correcciones... quedas avisado. |