Добро пожаловать в переполнение стека. Написание и чтение сложных структур просто не так просто. (И вы должны были попробовать более простые типы, прежде чем перейти к этому.)
Давайте начнем с 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);
}
}
Как только у вас это заработает, остальные вашей задачи должно быть легко.