我在用C ++编写和读取二进制文件时经历了一段糟糕的时光。
我从堆栈问题中学到了很多东西,但是我从没学过,我猜这个问题仍然存在于阅读过程中,

以下是读取和保存方法:

  void date::save(ofstream& fo){
    fo.write((char *) &jour, sizeof(int));
    fo.write((char *)&moi, sizeof(int));
    fo.write((char *)&annee, sizeof(int));

    size_t len = heure.size();
    fo.write((char *)&len,sizeof(size_t));
    fo.write(heure.c_str(), heure.size());
}

void date::load(ifstream& fi){
    fi.read((char *)&jour, sizeof(int));
    fi.read((char *)&moi, sizeof(int));
    fi.read((char *)&annee, sizeof(int));

    size_t len;
    fi.read((char *)&len, sizeof(size_t));
    char* temp = new char[len+1];
    fi.read(temp, len);
    temp[len] = '\0';
    heure = temp;
    delete [] temp;
}


另外:是否可以使用ofstream.write()功能直接保存具有动态属性的类?

非常感谢。

最佳答案

分配时,乍看之下阅读和写作似乎是正确的

heure = temp;


这儿存在一个问题。
您分配len + 1个字节的内存。 temp指向该内存的开头。
分配任务后(heure = temp),heure也指向相同的内存。然后,您调用delete,从那时开始,任何其他操作都可以将任何数据写入该内存(称为“野生指针”)。

你必须用

strcpy(heure, temp);


将每个字节从temp复制到heure分配的内存中。当然,请确保heure已分配足够的空间以适合temp的所有字节。

10-05 23:52