我试图从文本文件属性中读取:char *和int并创建类B的对象。这是我的实现:
B * p=new B[3];
for(int i=0;i<3;i++)
{
p[i]=B("John",300);
}
ofstream file("example.txt");
for(int i=0;i<3;i++)
{
file<<p[i].getName()<<" "<<p[i].GetValue()<<endl;
}
file.close();
//saved succesfully
ifstream file2("example.txt");
B *q=new B[3];
char* temp;
int time1;
for(int i=0;i<3;i++)
{
file2>>temp>>time1;
char*name1=new char[strlen(temp)+1];
strcpy(name1,temp); //here name1 is red correctly
q[i]=B(name1,time1); //
}
file2.close();
保存3个对象是成功的,我已经检查了文件。但是当我从中读取3个对象时,第一个对象被正确创建,但是对于其他对象,我传递的char * propery被初始化为“,”和第二个参数int也是正确的。为什么第一个对象成功创建而其他对象不成功?
答案 0 :(得分:2)
yyyy-MM-dd_HH-mm-ss
无效,因为file2 >> temp
是未初始化的指针。这个temp
需要一个预先分配的缓冲区。
我建议少用&#39;明星&#39; (理想情况下为零)和更多标准容器,在这种情况下为operator>>
和std::vector
。这也将解决你的内存泄漏......
好的,如果你不能,请实现自己的功能限制版std::string
。其他任何事情都违反了The single responsibility principle,并且这不是很好的C ++。
如果你不想走那么远,一个简单的解决方法是让std::string
成为一个实际数组,其大小与文件中名称所需的最大字符数相同。 / p>
最后,考虑一下this是否可以temp
B::name
。