我在用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的所有字节。