Вы не выделяете какую-либо память для переменных 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
кейс. Используйте локальную переменную и установите его в 1, если amount
является 0, в противном случае установите его фактического amount
, а затем вы можете использовать одну строку кода для выполнения распределения независимо от 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]);
}
}
message :: message(ifstream * myfile) {
*myfile >> amount;
int numElements = (amount == 0) ? 1 : amount;
next.reserve(numElements);
mes.reserve(numElements);
for (int i = 0; i < numElements; ++i) {
int value;
*myfile >> value;
next.push_back(value);
std::string line;
std::getline(*myfile, line);
mes.push_back(line);
}
}
Любая причина * не * использовать 'std :: vector', вместо того чтобы делать все это руководство, подверженное ошибкам динамическое распределение? –
Вы можете столкнуться с этой проблемой после устранения сбоя: [C++ - Почему std :: getline() пропускает вход после форматированного извлечения? - Переполнение стека] (http://stackoverflow.com/questions/21567291/why-does-stdgetline-skip-input-after-a-formatted-extraction) – MikeCAT
Пропускать потоки по ссылке не указателями. Это уменьшает вероятность возникновения дефектов указателями, указывающими на неправильные местоположения. –