| |||
Como guardar un arreglo de objetos en un archivo Puedo guardar inputs, pero no logro guardar todo el bojeto. Tengo una clase persona, con su metodo capturar, que despues de ingresar datos guardo en una lista. Ambos los llamo desde main. Lo que quiero es guardar el objeto persona en el archivo, para despues leerlo, pasarlo a un arreglo y enviarlo a la lista. |
| |||
Respuesta: Como guardar un arreglo de objetos en un archivo OK, aquí dejo un código, no es exactamente lo que pregunte, pero me ayudará a darme una idea. El problema aquí es que capturo y si muestra, pero al cerrar y querer volver a mostrar, el programa truena. Creo que el error esta en la variable nombre, cuando es Char si funciona, pero como string no
Código:
#include<fstream> #include <iostream> using namespace std; struct { int matricula; string nombre; int edad; }alumno; int main() { int opc; do{ cout <<endl << "1. Capturar" <<endl; cout << "2. Mostrar" ; cin >>opc; if(opc==1){ cout <<"dame matricula :" ; cin >> alumno.matricula; cout << "NOmbre:" ; fflush(stdin); getline(cin,alumno.nombre); cout << "dame edad :" ; cin >> alumno.edad; FILE *archdisco; archdisco = fopen( "alumnos.dat" , "at+" ); fwrite(&alumno,sizeof(alumno),1,archdisco); fclose(archdisco); } if(opc==2){ FILE *archdisco; archdisco = fopen( "alumnos.dat" , "at+" ); while(fread(&alumno, sizeof(alumno),1,archdisco)==1){ cout << " MATRICULA " <<alumno.matricula; cout << "Nombre " << alumno.nombre; cout << " MESES " <<alumno.edad<<endl; } fclose(archdisco); } } while(opc!=3); return 0; } |
| |||
Respuesta: Como guardar un arreglo de objetos en un archivo
Código C++:
Ver original estás haciendo uso de la clase string. Esta clase hace, internamente, uso de memoria dinámica. Cuando tu haces:
Código C++:
Ver original Estás cogiendo la memoria ocupada por "alumno" y la estás volcando directamente al fichero... el problema es que de "nombre" estás copiando un puntero y no la cadena almacenada en dicha clase. Cuando recuperas el contenido del archivo, sobreescribes el estado del objeto "nombre", lo que sucede entonces es que consigues que su puntero interno apunte a donde alguna vez estuvo la cadena a la que apuntaba... pero esa porción de memoria ya no te pertenece y, muy posiblemente, haya sido sobreescrita por otro proceso o esté reservada. Además, deberías evitar a toda costa hacer uso de fflush, al menos con buffers de entrada. Cito textual: Cita: Es decir, fflush está pensado para buffers de saliday solo bajo ciertas condiciones... en el resto de circuntancias (y eso incluye buffers de entrada) el resultado puede ser impredecible. If the given stream was open for writing (or if it was open for updating and the last i/o operation was an output operation) any unwritten data in its output buffer is written to the file. If stream is a null pointer, all such streams are flushed. In all other cases, the behavior depends on the specific library implementation. In some implementations, flushing a stream open for reading causes its input buffer to be cleared (but this is not portable expected behavior). |
| |||
Respuesta: Como guardar un arreglo de objetos en un archivo OK, entiendo. Entonces como puedo hacer que al capturar el stream no me guarde el puntero a su dirección en memoria? O no se puede y debo usar char forzosamente? En cuanto al flush, no acostumbro, generalmente lo que hago para un string es getline (cin >> ws, nombre) Gracias por tu ayuda. |
Etiquetas: |