我正在做OOP的最后一个项目,其中一部分是制作一些数据库,我在这方面遇到了麻烦。
每次创建Alquiler x时,都需要转到数据库的vector<Alquiler>,然后将其存储在二进制文件中。问题是我可能管理的大小不对,因为一旦我添加了几个Alquiler,数组就会被垃圾填满,总是输出随机字符。
这是代码,我试图尽可能地压缩它,只留下相关部分。如果有人想看一看,我会非常感谢。
#include <iostream>
#include <vector>
#include <string>
#include <fstream>
using namespace std;
struct Date
{
    int day, month, year;
};
struct structalquiler
{
    int dni, totalq, dep;
    int faday, famonth, fayear;
    int fdday, fdmonth, fdyear;
    vector<string> artlist;
};
class Alquiler {
private:
    
    int a_DNI_Cliente;
    int a_Total_Alquiler, a_Deposito;
    Date a_Date_Alquiler, a_Date_Devolucion;
    vector<string> a_Article_list;
    
public:
    Alquiler ();
    Alquiler (int dni, int totalq, int dep, Date fa, Date fd, vector<string> arts);
    void save(ofstream &outfile) {                      // Bin file writing
        structalquiler reg;
        reg.dni = a_DNI_Cliente;
        reg.dep = a_Deposito;
        reg.totalq = a_Total_Alquiler;
        reg.faday = a_Date_Alquiler.day;
        reg.famonth = a_Date_Alquiler.month;
        reg.fayear = a_Date_Alquiler.year;
        reg.fdday = a_Date_Devolucion.day;
        reg.fdmonth = a_Date_Devolucion.month;
        reg.fdyear = a_Date_Devolucion.year;
        reg.artlist = a_Article_list;
        int wo_size = sizeof(reg) - sizeof(reg.artlist);
        outfile.write((char*)®, wo_size);
        int size = reg.artlist.size();              // Writing of the vector<string>
        outfile.write((char*)&size, sizeof(int));
        for (int i = 0; i < size; i++)
        {
            int letter_amount = reg.artlist[i].length();
            outfile.write((char*)&letter_amount, sizeof(int));
            outfile.write(reg.artlist[i].c_str(), letter_amount);
        }
        
    }
    void read(ifstream &infile) {                           // Reading of the file
        structalquiler reg;
        int wo_size = sizeof(reg) - sizeof(reg.artlist);
        infile.read((char*)®, wo_size);
        a_DNI_Cliente = reg.dni;
        a_Deposito = reg.dep;
        a_Total_Alquiler = reg.totalq;
        a_Date_Alquiler.day = reg.faday;
        a_Date_Alquiler.month = reg.famonth;
        a_Date_Alquiler.year = reg.fayear;
        a_Date_Devolucion.day = reg.fdday;
        a_Date_Devolucion.month = reg.fdmonth;
        a_Date_Devolucion.year = reg.fdyear;
        // a_Article_list = reg.artlist;
        vector<string> v;                                   // Reading of the vector<string>
        int read_size;
        infile.read((char*)&read_size, sizeof(int));
        for (int i = 0; i < read_size; i++)
        {
            int letter_amount;
            infile.read((char*)&letter_amount, sizeof(int));
            char* buffer = new char[letter_amount + 1];
            infile.read(buffer, letter_amount);
            buffer[letter_amount] = '\0';
            v.push_back(string(buffer));
            delete [] buffer;
        }
        
        a_Article_list = v;
    }
};
Alquiler::Alquiler(){}
Alquiler::Alquiler(int dni, int totalq, int dep, Date fa, Date fd, vector<string> arts)
        : a_DNI_Cliente(dni), a_Total_Alquiler(totalq), a_Deposito(dep), a_Date_Alquiler(fa), a_Date_Devolucion(fd), a_Article_list(arts) {}
class Database {
private:
    string m_file_name = "alquileres.dat";
    vector<Alquiler> Arreglo_Alquileres;
public:
    Database() {                                                                // storing in the vector<Alquiler>
        ifstream infile(m_file_name.c_str(), ios::binary|ios::ate);
        if (infile.is_open())
        {
            int size = infile.tellg();
            int cant = size / sizeof(structalquiler);
            Arreglo_Alquileres.resize(cant);
            infile.seekg(0);
            for (int i = 0; i < cant; i++)
            {
                Arreglo_Alquileres[i].read(infile);
            }
            infile.close();
            
        }
    }
    void add(const Alquiler &x) {
        Arreglo_Alquileres.push_back(x);
        write();
    }
    bool write() {
        ofstream outfile(m_file_name.c_str(), ios::binary|ios::trunc);
        if (!outfile.is_open()) return false;
        int cant = Arreglo_Alquileres.size();
        for (int i = 0; i < cant; i++)
        {
            Arreglo_Alquileres[i].save(outfile);
        }
        outfile.close();
        return true;
        
    }
};
int main() {
    
    Database base;
    vector<string> v = {"panuelo", "alpargatas", "chaleco"};
    Alquiler x(9,8,7,{6,5,4},{3,2,1},v);
    base.add(x);
    return 0;
}
感谢任何帮助。