从文件读取字符串时发生访问冲突(C++)[重复]

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

我将一些数据保存到文件中,当我在调用析构函数后立即读取程序末尾的所有数据时,出现访问冲突错误。 数据读取成功但是一直抛出异常

这是我的课:

    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();
}

c++ file-handling
1个回答
0
投票

将字符串写入文件的方式 从键盘获取数据后,我将除日期之外的数据直接放入文件中,我通过

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();}

结果:

© www.soinside.com 2019 - 2024. All rights reserved.