将列表导出到文件时,会重复写入列表的最后一个对象

Last object of list is written repeatedly when exporting list to file

本文关键字:列表 最后 一个对象 文件      更新时间:2023-10-16

这是我用来将列表一次导出一个对象到文件的方法:

#define DATA_FILE "output.txt"
void File_Data::Save_Data(void)
{
    fstream file;
    remove(DATA_FILE);
    file.open(DATA_FILE, ios::out | ios::binary);
    file.seekg(ios::beg);
    for (listIter = listCont.begin(); listIter != listCont.end(); listIter++)
    {
        file.write((char *)&listIter, sizeof(Radio_Data));
        if (File_Error(file, "nCan't update filen"))
        {   return; }
        cout << "nRecord " << listIter->GetName() << " added to file.n" << endl;
        cout << "Name: " << listIter->GetName() << endl;
        cout << "Callsign: " << listIter->GetCallsign() << endl;
        cout << "Band: " << listIter->GetBand() << endl;
        cout << "Frequency: " << listIter->GetFrequency() << endl;
        cout << "Type: " << listIter->GetType() << endl;
        cout << "City: " << listIter->GetCity() << endl;
        cout << "Phone: " << listIter->GetPhone() << endl;
        cout << "Website: " << listIter->GetWebsite() << endl;
    }
    file.close();
}

比方说,我在列表中有3个对象(项目1、项目2、项目3)。当我调用这个方法时,cout将以正确的顺序显示列表的正确内容。然而,当我用程序查看输出文件/加载文件时,我会看到最后一个对象的3个重复(item3,item3,item3)。我做错了什么?

此行不会生成Radio_Data对象的正确地址:

file.write((char *)&listIter, sizeof(Radio_Data));

在获取对象地址之前,您应该取消对迭代器的引用,如下所示:

file.write((char *)&(*listIter), sizeof(Radio_Data));

由于*listIter计算为迭代器指向的对象的引用,因此&(*listIter)计算为指向相应Radio_Data对象的指针。