我正在做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; }
感谢任何帮助。