Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Como guardar un arreglo de objetos en un archivo

Estas en el tema de Como guardar un arreglo de objetos en un archivo en el foro de C/C++ en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 30/10/2014, 09:44
 
Fecha de Ingreso: febrero-2014
Mensajes: 8
Antigüedad: 10 años, 2 meses
Puntos: 0
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.
  #2 (permalink)  
Antiguo 30/10/2014, 10:39
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 6 meses
Puntos: 204
Respuesta: Como guardar un arreglo de objetos en un archivo

Sin código es complicado decirte dónde está el error.
  #3 (permalink)  
Antiguo 30/10/2014, 10:55
 
Fecha de Ingreso: febrero-2014
Mensajes: 8
Antigüedad: 10 años, 2 meses
Puntos: 0
Respuesta: Como guardar un arreglo de objetos en un archivo

Cita:
Iniciado por eferion Ver Mensaje
Sin código es complicado decirte dónde está el error.
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;
}
  #4 (permalink)  
Antiguo 30/10/2014, 11:04
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 6 meses
Puntos: 204
Respuesta: Como guardar un arreglo de objetos en un archivo

Código C++:
Ver original
  1. struct
  2. {
  3.   int matricula;
  4.   string nombre;
  5.   int edad;
  6. }alumno;

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
  1. fwrite(&alumno,sizeof(alumno),1,archdisco);

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:
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).
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.
  #5 (permalink)  
Antiguo 30/10/2014, 11:16
 
Fecha de Ingreso: febrero-2014
Mensajes: 8
Antigüedad: 10 años, 2 meses
Puntos: 0
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: arreglo, clase, objetos
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 12:59.