将内部带有矢量的结构保存/读取到二进制文件中

Saving/reading a struct with a vector inside into a binary file

本文关键字:保存 读取 二进制文件 结构 内部      更新时间:2023-10-16

我想将以下结构保存到二进制文件中:

struct Usuario{
char nombre[256];
char apellido[256];
char ingresos[256];
std::vector<Bill> manejador_facturas;
};

比尔也是一个结构体:

struct Bill{
float monto;
int dia;
int mes;
int anio;
char empresa[256];
};

我试图将信息写入二进制文件的是:

void Perfil::GuardarEnBinario(std::ostream &archivo) {
Usuario reg;
Bill auxiliar;
strcpy(reg.nombre, nombre.c_str());
strcpy(reg.apellido, apellido.c_str());
strcpy(reg.ingresos, ingresos.c_str());
for(size_t i = 0; i < manejador_facturas.size(); i++){
strcpy(auxiliar.empresa, manejador_facturas[i].empresa);
auxiliar.monto = manejador_facturas[i].monto;
auxiliar.dia = manejador_facturas[i].dia;
auxiliar.mes = manejador_facturas[i].mes;
auxiliar.anio = manejador_facturas[i].anio;
reg.manejador_facturas.push_back(auxiliar);
}
archivo.write((char*)&reg, sizeof(reg));
}

起初我认为它有效,因为.exe工作正常,但问题是我保存的信息在我尝试查看它时根本没有显示(不知道.bin是否损坏还是什么(。读取结构的代码为:

void Perfil::LeerDesdeBinario(std::istream &archivo) {
Usuario reg;
Bill auxiliar;
archivo.read((char*)&reg, sizeof(reg));
nombre = reg.nombre;
apellido = reg.apellido;
ingresos = reg.ingresos;
for(size_t i = 0; i < reg.manejador_facturas.size(); i++){
strcpy(auxiliar.empresa, reg.manejador_facturas[i].empresa);
auxiliar.monto = reg.manejador_facturas[i].monto;
auxiliar.dia = reg.manejador_facturas[i].dia;
auxiliar.mes = reg.manejador_facturas[i].mes;
auxiliar.anio = reg.manejador_facturas[i].anio;
manejador_facturas.push_back(auxiliar);
}
}

欢迎来到堆栈溢出。编写和阅读复杂的结构并不是那么容易。(在前进到这个类型之前,你应该尝试更简单的类型。

让我们从char[256]开始:

void GuardarEnBinario(char *A, std::ostream &archivo)
{
ofstream fout("data", ios::out | ios::binary);
archivo.write(A, 256);
}
void LeerDesdeBinario(char *B, std::istream &archivo)
{
archivo.read(B, 256);
}

在继续之前对此进行测试。

现在尝试一个Bill

void GuardarEnBinario(Bill &B, std::ostream &archivo)
{
archivo.write((char*)&B.monto, sizeof(float));
archivo.write((char*)&B.dia, sizeof(int));
GuardarEnBinario(B.empresa, archivo);
}
void LeerDesdeBinario(Bill &B, std::istream &archivo)
{
archivo.read((char*)&B.monto, sizeof(float));
archivo.read((char*)&B.dia, sizeof(int));
LeerDesdeBinario(B.empresa, archivo);
}

(我省略了一些字段;应该清楚如何处理它们。

在继续之前,请对此进行测试,并确保您理解它。

现在尝试一个vector<Bill>

void GuardarEnBinario(std::vector<Bill> &V, std::ostream &archivo)
{
unsigned int n = V.size();
cout << n << endl;
archivo.write((char *) &n, sizeof(unsigned int));
for(unsigned int k=0; k<n; ++k)
{
GuardarEnBinario(V[k], archivo);
}
}
void LeerDesdeBinario(std::vector<Bill> &V, std::istream &archivo)
{
unsigned int n;
archivo.read((char *) &n, sizeof(unsigned int));
cout << n << endl;
Bill B;
for(unsigned int k=0; k<n; ++k)
{
LeerDesdeBinario(B, archivo);
V.push_back(B);
}
}

一旦你完成了这项工作,你的其余任务应该很容易。