Сохранение / чтение структуры с вектором внутри в двоичный файл - PullRequest
0 голосов
/ 03 февраля 2020

Я хочу сохранить следующую структуру в двоичном файле:

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);
    }
}

1 Ответ

1 голос
/ 03 февраля 2020

Добро пожаловать в переполнение стека. Написание и чтение сложных структур просто не так просто. (И вы должны были попробовать более простые типы, прежде чем перейти к этому.)

Давайте начнем с 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);
    }
  }

Как только у вас это заработает, остальные вашей задачи должно быть легко.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...