我想在控制台中创建简单的待办事项类似程序,您可以在其中输入您的任务((名称)(级别)(有趣的级别)),它会将其从向量保存到二进制文件。我有这个程序,但是当我尝试将任务保存到文件然后从中读取时,它给了我一个错误
Segmentation fault (core dumped)
,我不知道为什么......我尝试调试,错误我钢不知道为什么这是行不通的。这是 git-hub 链接(here)。我该怎么办?
正如评论中提到的,您无法对动态对象(例如 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();
}
}