void Mixture::Readfile(const char* filename)//从磁盘文件中读取一个混合物对象的数据 { if (ps) delete[]ps; int i; char ch[100] = "****"; ifstream in(filename); in >> num; ps = new Pure_substance[num]; in.getline(ch, 99); in.getline(ch, 99); for (i = 0; i < num; i++) { in >> ps[i]; } in.close(); }请检查这段代码有什么问题
时间: 2024-03-16 19:43:58 浏览: 158
这段代码存在以下问题:
1. 在读取文件之前,应该检查文件是否成功打开。可以使用 `if (!in)` 来检查文件是否打开成功。
2. 在读取文件之前,应该将 `ps` 初始化为 `NULL`,否则可能会导致程序崩溃。
3. 在使用 `getline` 读取文件时,应该将读取的内容丢弃,否则可能会影响后面的读取操作。可以使用 `in.ignore(100, '\n');` 来丢弃一行内容。
改正后的代码如下:
```
void Mixture::Readfile(const char* filename) {
if (ps)
delete[] ps;
ps = NULL; // 初始化指针为 NULL
int i;
char ch[100] = "****";
ifstream in(filename);
if (!in) {
cerr << "Error: cannot open file " << filename << endl;
return;
}
in >> num;
in.ignore(100, '\n'); // 丢弃一行内容
in.getline(ch, 99);
for (i = 0; i < num; i++) {
in >> ps[i];
}
in.close();
}
```
相关问题
class Mixture//混合物类 { Pure_substance *ps;//用于建立堆区数组,保存各组成物质 int num;//包含组成的种类数目 class Pure_substance//纯物质类 { string name;//物质名称 string formula;//化学式 double weight;//化学式量 double quality;//质量 void Mixture::Append(Pure_substance & x)//添加纯物质对象x {/*在此补充本段代码,如果x是一种新成分,就扩大堆区数组,加入新组成物质,并变更组成的种类数目;否则只需要更变原组成物质的质量。15分*/ }
ps[num] = x; //将新的纯物质对象添加到堆区数组中
bool flag = false; //标记是否为新的成分
for(int i=0; i<num; i++) {
if(ps[i].name == x.name) { //如果已经存在该成分
ps[i].quality += x.quality; //更新原有的成分质量
flag = true;
break;
}
}
if(!flag) { //如果是新的成分
num++; //增加成分数目
}
Mixture& Mixture::operator+(Mixture& m)//实现将两个混合物对象合并为一个混合物对象 { static Mixture sum = *this; int i; for (i = 0; i < m.num; i++) sum.Append(m.ps[i]); return *this; }请检查这段代码哪里有问题
这段代码有两个问题:
1. 在加法运算符重载函数中,应该返回两个对象合并后的新对象,而不是修改其中一个对象并返回它自身。所以应该将 `return *this;` 改为 `return sum;`。
2. 在这个重载函数中,`sum` 是一个静态局部变量。因此,如果调用这个函数两次及以上,`sum` 的值将不会被重置,导致结果错误。应该将 `sum` 声明为局部变量,并将其作为返回值返回。
改正后的代码如下:
```
Mixture Mixture::operator+(Mixture& m) {
Mixture sum = *this;
int i;
for (i = 0; i < m.num; i++)
sum.Append(m.ps[i]);
return sum;
}
```
阅读全文