我正在做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*)&reg, 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*)&reg, 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;
}


感谢任何帮助。

C++在读取带有向量的结构时遇到问题<;字符串>;从二进制文件的更多相关文章

  1. 在编译时编译Xcode中的C类错误:stl vector

    我有一个C类,用gcc和可视化工作室中的寡妇在linux上编译.boid.h:并在boid.cpp中:但是,当我在Xcode中编译此代码时,我收到以下错误:有任何想法吗?我以为你可以使用C/C++代码并在Xcode中编译没有问题?.m文件被视为具有Objective-C扩展名的.c文件..mm文件被视为具有Objective-C扩展名的.cpp文件,那么它被称为Objective-C只需将.m文件重命名为.mm,右键单击或按住Ctrl键并在Xcode中的文件中选择重命名.

  2. swift2 运算符函数

    运算符函数前置或后置运算符函数前标注prefix或postfix组合赋值表达式比较运算符自定义运算符在自定义运算符中还可以设定自定义运算符的优先级和结合性,来处理更复杂的任务。

  3. Swift高级运算符(Advanced Operators)

    按位运算符~1变0,0变1。$全1得1,其他为0|有1得1,其他为0^相异为1,相同为0整体右移,左边填0。算子函数上面讲解的都是简单的运算符,下面的是为对象添加运算符,使之可计算。符号在中间前缀和后缀前缀关键字prefix后缀关键字postfix复合赋值运算符这里用+=举例。

  4. Swift语言和其他计算机语言的比较

    Swift集成了传统面向对象编程语言的特性,同时又具备函数式编程的一些特征。在2014年WWDC之前,用来开发iOS应用的语言被称为Objective-C,它是标准C语言的扩展。使用Objective-C可以完成C语言所能完成的任何工作。这里不得不提到C++语言,事实上C++和Objective-C语言几乎是同时出现的。和Objective-C语言的简洁不同,C++语言几乎包含了所有可能的特性。

  5. Swift Name Mangling - Swift语言的名字重整技术

    在比如C这样的语言中,任何给定的名字(符号)只能对应唯一的一个函数或数据,不需要名字重整。因此,c++编译器使用一组严格的编码规则“mangles”(重整)了符号。想获取更多的关于经典C++编译器重整名字的内容,请参考ItaniumC++ABIdocumentation.总结:Object-C类似于C语言,Swift类似于C++,有函数重载,有虚函数表,需要命名重整。

  6. 你是如何评价Swift的,谈谈你的感受!

    假如之前已经掌握了Objective-C,切换到Swift也不难。Swift还没有很好地解决好跟C和C++混编的问题。随着时间推移,Swift在整个iOS/Mac工程中占的代码比例会越来越多,而Objective-C作为粘合层还是会存在。只是等你真正使用Swift编写一两个项目,就回不了头。Swift有些简便快速的写法,在Objective-C中是没有办法做到的。并且Swift的一些语言特性避免了很多Objective-C的坑。使用Swift编写的任何功能,使用Objective-C也可以做到,但是会麻烦

  7. 2017 年热门编程语言排行榜,你的语言上榜没?

    2016年11月的排名结果显示,Java依然是最受大家欢迎的语言,C和C++排名紧随其后。GitHub在2016年9月年度会议之前,Github在此分享了其统计报告。随后它在平台上公布了热门语言排行表。该公司支持30多种编程语言,用户可随心选择。按照使用量排名,Java排在第一位,Javascript,PHP和C以一万多的差距尾随其后。

  8. android – 在onRestoreInstanceState中发生ClassCastException

    ClassCastException随机发生以恢复onRestoreInstanceState()中的Vector.通常恢复向量很好,但有时会发生异常.我认为它发生在活动进入后台并被破坏但我不确定.有任何想法吗?谢谢.添加:我忘了附上异常日志.那是解决方法我使用下一个代码来恢复Vector:它会阻止java.lang.classCastException并保存元素顺序.要恢复Stack,您可以使用

  9. android – Build在debug中运行,在release中失败 – ZipException重复条目

    我正在将应用程序从2.3升级到Nougat(SDK25).当我添加com.android.support:appcompat-v7:25.0.0以支持ActivityCompat.requestPermissions时.当我在调试模式下运行它时,应用程序运行没有问题,但使用./gradlewassembleDebug运行会导致以下错误:当我在调试模式下运行时,应用程序构建没有问题,但是,当我尝试构

  10. 在Android上解码Java或C/C++中的Airplay数据包

    提前致谢马特解决方法虽然Java编译为在虚拟机中运行的字节码,但它可能不一定比本机编译的可执行文件更慢(或更快).这一切都取决于程序!在这种情况下,Java可能会变慢,原因有很多:>解码实现可能只是编码/优化不佳?(我必须在这里注意,我不是Java的专家!)但是,我仍然不会调用Java本质上比C或C慢.我相信你可以在互联网上找到many-abenchmarks和测试,比较一种语言和另一种语言,有些人声称在一定程度上(出于骄傲和自我?

随机推荐

  1. 如何扩展ATmega324PB微控制器的以下宏寄存器?

    我目前正在学习嵌入式,我有以下练习:展开以下宏寄存器:如果有人解决了这个问题,我将不胜感激,以便将来参考

  2. Python将ONNX运行时设置为返回张量而不是numpy数组

    在python中,我正在加载预定义的模型:然后我加载一些数据并运行它:到目前为止,它仍在正常工作,但我希望它默认返回Tensor列表,而不是numpy数组。我对ONNX和PyTorch都是新手,我觉得这是我在这里缺少的基本内容。这将使转换中的一些开销相同。

  3. 在macOS上的终端中使用Shell查找文件中的单词

    我有一个文本文件,其中有一行:我需要找到ID并将其提取到变量中。我想出了一个RexEx模式:但它似乎对我尝试过的任何东西都不起作用:grep、sed——不管怎样。我的一个尝试是:我为这样一个看似愚蠢的问题感到抱歉,但我在互联网上找不到任何东西:我在SO和SE上读了几十个类似的问题,并在谷歌上搜索了几个教程,但仍然无法找到答案。欢迎提供任何指导!

  4. react-chartjs-2甜甜圈图中只有标题未更新

    我正在使用react-chartjs-2在我的网站中实现甜甜圈图。下面是我用来呈现图表的代码。我将甜甜圈图的详细信息从父组件传递到子组件,所有道具都正确传递。当我在beforeDraw函数外部记录props.title时,它会记录正确的值,但当我在beforeDraw函数内部记录props.title时,它将记录标题的前一个值,从而呈现标题的前值。我在这里做错了什么?

  5. 如何在tkinter中使用Python生成器函数?

    生成器函数承诺使某些代码更易于编写。但我并不总是知道如何使用它们。假设我有一个斐波那契生成器函数fib(),我想要一个显示第一个结果的tkinter应用程序。当我点击“下一步”按钮时,它会显示第二个数字,依此类推。我如何构建应用程序来实现这一点?我可能需要在线程中运行生成器。但如何将其连接回GUI?

  6. 如何为每次提交将存储库历史记录拆分为一行?

    我正在尝试获取存储库的历史记录,但结果仅以单行文本的形式返回给我。

  7. 尝试在颤振项目上初始化Firebase时出错

    当尝试在我的颤振项目上初始化firebase时,我收到了这个错误有人知道我能做什么吗?应用程序分级Gradle插件Gradle项目颤振相关性我已经将firebase设置为Google文档已经在另一个模拟器上尝试过,已经尝试过创建一个全新的模拟器,已经在不同的设备上尝试过了,已经尝试了特定版本的firebase,已经尝试添加但没有任何效果,已经在youtube上看到了关于它的每一个视频,该应用程序在android和iOS两个平台上都抛出了这个错误

  8. 在unix中基于当前日期添加新列

    我试图在unix中基于时间戳列在最后一个单元格中添加一个状态列。我不确定如何继续。

  9. 麦克斯·蒙特利。我一直得到UncaughtReferenceError:当我在终端中写入node-v时,节点未定义

    如果这是您应该知道的,请确认:我已将所有shell更改为默认为zsh。当我在终端中写入node-v时,我一直收到“UncaughtReferenceError:nodeisnotdefined”。但它显示节点已安装。我是个新手,在这方面经验不足。

  10. 如何在前端单击按钮时调用后端中的函数?

    那么如何在后端添加一个新的端点,点击按钮调用这个函数。

返回
顶部