我和其他成员一起上课“消息”:
protected:
int * next;
int amount;
std::string ** mes;
public:
message(std::ifstream*);
,构造函数的代码是:
message :: message(ifstream * myfile){
*myfile >> amount;
if (amount==0){
next = new int[1];
*myfile >> next[0];
mes = new string*[1];
getline(*myfile,*mes[0]);
}
else{
next = new int[amount];
mes = new string*[amount];
for (int i=0;i<amount;i++){
*myfile >> next[i];
getline(*myfile,*mes[i]);
}
}
}
使用运算符&gt;&gt;从文件读取工作正常,但程序在getline()崩溃 - 为什么?我应该改变什么?
答案 0 :(得分:2)
您没有为要求std::string
读取的std::getline()
变量分配任何内存。您正在分配不指向任何内容的string*
指针数组。您需要将代码更改为:
继续使用指针数组,但为它们分配实际的string
变量:
std::string ** mes;
if (amount == 0) {
...
mes = new string*[1];
mes[0] = new string; // <-- here
std::getline(*myfile, *mes[0]);
}
else {
...
mes = new string*[amount];
for (int i = 0; i < amount; ++i) {
mes = new string[amount]; // <-- here
}
for (int i = 0; i < amount; ++i) {
...
std::getline(*myfile, *mes[i]);
}
}
删除不必要的间接级别以开始:
std::string * mes;
if (amount == 0) {
...
mes = new string[1];
std::getline(*myfile, mes[0]);
}
else{
...
mes = new string[amount];
for (int i = 0; i < amount; ++i) {
...
std::getline(*myfile, mes[i]);
}
}
Wit说,你应该停止使用原始数组,而是使用std::vector
:
#include <vector>
protected:
std::vector<int> next;
std::vector<std::string> mes;
int amount;
message :: message(ifstream * myfile) {
*myfile >> amount;
if (amount == 0) {
next.resize(1);
mes.resize(1);
*myfile >> next[0];
std::getline(*myfile, mes[0]);
}
else {
next.resize(amount);
mes.resize(amount);
for (int i = 0; i < amount; ++i) {
*myfile >> next[i];
std::getline(*myfile, mes[i]);
}
}
}
无论哪种方式,您都应该考虑删除amount == 0
案例的冗余代码。如果amount
为0,则使用局部变量并将其设置为1,否则将其设置为实际amount
,然后无论{{1}如何,您都可以使用单个代码行执行分配} value:
amount
message :: message(ifstream * myfile) {
*myfile >> amount;
int numElements = (amount == 0) ? 1 : amount;
next = new int[numElements];
mes = new string[numElements];
for (int i = 0; i < numElements; ++i) {
*myfile >> next[i];
getline(*myfile, mes[i]);
}
}