我将一些数据保存到文件中,当我在调用析构函数后立即读取程序末尾的所有数据时,出现访问冲突错误。 数据读取成功但是一直抛出异常
这是我的课:
class DoList
{
public:
DoList(const std::string& , const std::string& , const std::string& ,const int& , const int&, const int&, const int&);
DoList();
~DoList();
bool Input_Task();
bool Remove_Task();
void Read_Data();
private:
int m_Year;
int m_Month;
int m_Day;
int m_ID;
std::string m_TaskName;
std::string m_Description;
std::string m_Status;
};
这是我的类.cpp
我输入任务的功能:
bool DoList::Input_Task() /*Works fine*/
{
DoList Data;
std::cout << "Enter Your Task ID: ";
std::cin >> Data.m_ID;
std::cin.ignore();
std::cout << "Enter Your Task Name: ";
std::getline(std::cin, Data.m_TaskName);
std::cout << "Enter Description: ";
std::getline(std::cin, Data.m_Description);
time_t now = time(NULL);
tm now_tm = {};
localtime_s(&now_tm, &now);
Data.m_Year = 1900 + now_tm.tm_year;
Data.m_Month = 1 + now_tm.tm_mon;
Data.m_Day = now_tm.tm_mday;
std::ofstream file("Tasks_Data.dat", std::ios::app);
if (!file.is_open())
{
std::cout << "file cannot be opened";
return false;
}
file.write((char*)(&Data), sizeof(DoList));
file.close();
return true;
}
我读取数据的函数
void DoList::Read_Data()
{
DoList Read;
std::ifstream file("Tasks_Data.dat");
if (!file.is_open())
{
std::cout << "file cannot be opened";
}
while (file.read((char*)(&Read), sizeof(DoList)))
std::cout << "Task ID: " << Read.m_ID << ", Task Name: " << Read.m_TaskName << ", Description: " << Read.m_Description << ", Status: " << Read.m_Status << ", Date: " << Read.m_Year << "/"
<< Read.m_Month << "/" << Read.m_Day << std::endl;
file.close();
}
将字符串写入文件的方式 从键盘获取数据后,我将除日期之外的数据直接放入文件中,我通过
to_String()
将其制成字符串,以便于阅读
bool DoList::Input_Task(){
std::ofstream file("Tasks_Data.dat", std::ios::app, std::ios::binary);
if (!file.is_open())
{
std::cout << "file cannot be opened";
return false;
}
Task Write;
std::cout << "Enter Your Task ID: ";
std::cin >> Write.ID;
std::cin.ignore();
std::cout << "Enter Your Task Name: ";
std::getline(std::cin, Write.TaskName);
std::cout << "Enter Description: ";
std::getline(std::cin, Write.Description);
time_t now = time(NULL);
tm now_tm = {};
localtime_s(&now_tm, &now);
int Year;
int Month;
int Day;
Year = 1900 + now_tm.tm_year;
Month = 1 + now_tm.tm_mon;
Day = now_tm.tm_mday;
Write.Date = std::to_string(Year) + "/" + std::to_string(Month) + "/" + std::to_string(Day);
file << Write.ID << "\n";
file << Write.TaskName << "\n";
file << Write.Description << "\n";
file << Write.Status << "\n";
file << Write.Date << "\n";
file.close();
return true;}
要读取文件,我将所有内容插入字符串中,然后通过 while 循环读取字符串,将我的 ID(这是我们从文件中读取的第一个数据)转换为我使用的整数
std::stoi
然后我开始读取所有内容来自getline()
的文件。
void DoList::Read_Data(){
DoList obj;
Task Read;
std::ifstream file("Tasks_Data.dat", std::ios::in, std::ios::binary);
if (!file.is_open())
{
std::cout << "file cannot be opened";
}
std::string line;
while (std::getline(file, line))
{
Read.ID = std::stoi(line);
std::getline(file, Read.TaskName);
std::getline(file, Read.Description);
std::getline(file, Read.Status);
std::getline(file, Read.Date);
std::cout << "Task ID: " << Read.ID;
std::cout << ", Task Name: " << Read.TaskName;
std::cout << ", Description: " << Read.Description;
std::cout << ", Status: " << Read.Status;
std::cout << ", Date: " << Read.Date << std::endl;
}
file.close();}