尝试将不常见的数据类型以二进制形式保存到文件中,然后将其写入向量

问题描述 投票:0回答:1

我想在控制台中创建简单的待办事项类似程序,您可以在其中输入您的任务((名称)(级别)(有趣的级别)),它会将其从向量保存到二进制文件。我有这个程序,但是当我尝试将任务保存到文件然后从中读取时,它给了我一个错误

Segmentation fault (core dumped)
,我不知道为什么......我尝试调试,错误我钢不知道为什么这是行不通的。这是 git-hub 链接(here)。我该怎么办?

c++ vector binary segmentation-fault
1个回答
0
投票

正如评论中提到的,您无法对动态对象(例如 std::string)执行您想要执行的操作。当您加载这样的对象时,您永远不会知道它有多大。因此,您的程序可能会开始将另一个对象的一部分加载到 std::string 上。
我认为最简单的解决方案是将 std::string 更改为固定大小的 char 数组,并限制任务可以拥有的名称大小。波纹管是一个完全有效的示例。

#include <fstream>
#include <iostream>
#include <vector>

struct data
{
    int     m_value     = 0;
    int     m_priority  = 0;
    char    m_task[28]  = {"\0"};
};

int main()
{
    std::vector<data> dat;
    data datt;
    for (int i = 0; i < 4; i++)
    {
        sprintf( datt.m_task,  "task %d", i);
        datt.m_priority = i;
        datt.m_value = i*4;
        dat.push_back(datt);
    }
    std::ofstream ofile;
    ofile.open("data.dat", std::ios::binary);
    if (ofile.is_open())
    {
        for (const auto& d : dat)
            ofile.write(reinterpret_cast<const char *>(&d), sizeof( d));                
        ofile.close();
    }

    std::ifstream ifile;
    ifile.open("data.dat", std::ios::binary);
    if (ifile.is_open())
    {
        while (!ifile.eof()){
            ifile.read(reinterpret_cast<char *>(&datt), sizeof( datt));
            std::cout << datt.m_value << " " << datt.m_priority << " " << datt.m_task << std::endl;
        }                
        ifile.close();
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.