重新打开读取文件中的对象后分段错误

segmentation fault after reading object in file re-openned

本文关键字:对象 分段 错误 新打开 读取 文件      更新时间:2023-10-16

我遇到了一个我无法解决的问题,当我尝试读取以前关闭但重新打开的文件时,我一使用对象就遇到了分段错误(newT(我遇到了分段错误,但我读取n没有问题,这是要读取的对象数量。奇怪的是,如果我正在阅读一个新文件,我没有问题,那么我做错了什么?

这是代码:

创建文件功能:

char* CreerHoraire(fstream& fichier, char* nomFichier)
{
    if(fichier.is_open())
        cout<<"Vous devez fermer le fichier en cours avant d'en créer un autre"<<endl;
    else
    {
        saisieNomFichier(nomFichier);
        fichier.open(nomFichier, fstream::in | fstream::out | fstream::binary);
        if(fichier)
            cout<<"Le fichier "<<nomFichier<<" a bien été ouvert"<<endl;
        else//if file doesn't exist I create it (no problem here)
        {
            fichier.open(nomFichier, fstream::in | fstream::out | fstream::binary |fstream::trunc);
            if(fichier)
                cout<<"Le fichier "<<nomFichier<<" a bien été créé"<<endl;
            else
                cout<<"Le fichier "<<nomFichier<<" a rencontré un problème à sa création !"<<endl;
        }
    }
    return nomFichier;
}

读取功能

template<typename T>
void ListeTriee<T>::load(ifstream& fichier)
{
    if(fichier.fail()) 
        throw InvalidException("Erreur ouverture fichier");
    else
    {
        int n;
        T newT;
        fichier.read ((char *)&n, sizeof(int));
        while(n)
        {
            fichier.read ((char*) &newT, sizeof(newT));
                    newT.Affiche();//seg fault
            this->insere(newT);//quand on utilise newT après lu
            n--;
        }
    }
    if(!fichier) throw InvalidException("Erreur lecture fichier");
}

谢谢:)

你应该对文件的对象进行真正的序列化/反序列化。通过从文件中复制字节来"构造"对象(其中包含函数(是无效的。

它可以适用于 POD(仅数据(对象,而无需在其他地方(没有指针(引用内存,但对于其他内容,写入/读取原始字节不起作用 - 例如,当您重新加载对象时,内存地址将全部错误。