Когда вы делаете fileStream>>help
, это не меняет значение указателя, оно переписывает содержимое строки, на которую указывает указатель. Таким образом, вы повторяете один и тот же указатель на вектор снова и снова. Таким образом, все указатели в векторе указывают на одну и ту же строку. И поскольку последнее, что записано в эту строку, было словом «день», это то, что вы получаете, когда вы печатаете каждый элемент вашего вектора.
Используйте вектор std::string
вместо:
string help;
vector<string> MyVector;
Если, как вы говорите, вы должны придерживаться vector<char*>
, то вам придется динамически выделять новую строку для каждого элемента. Вы не можете безопасно использовать char*
с operator>>
, потому что нет возможности рассказать ему, сколько места у вас на самом деле есть в вашей строке, поэтому я буду использовать std::string
для хотя бы для ввода.
std::string help;
vector<char*> MyVector;
while (fileStream>>help) {
char * p = new char[help.size() + 1];
strcpy(p, help.c_str());
MyVector.push_back(p);
}
Конечно, когда вы закончите с вектором, вы не можете просто позволить ему выйти из сферы действия. Вам нужно удалить каждый элемент вручную в цикле. Тем не менее, это все еще не полностью безопасно, потому что распределение памяти может вызвать исключение, вызывая любые строки, которые вы уже выделили, и помещаете вектор в утечку. Таким образом, вы действительно должны обернуть это все в блок try и быть готовы поймать std::bad_alloc
.
Это очень много хлопот. Если бы вы могли объяснить, почему, по вашему мнению, вам нужно использовать vector<char*>
, я уверен, кто-то может показать вам, почему вы этого не делаете.
Использование 'std :: vector' похоже на попытку установить квадратную привязку через круглое отверстие, они просто не подходят друг другу. –