(Извините, если мои предложения полны загадок, я сделаю все возможное, чтобы написать что-то читаемое) Привет, Я работаю над функцией, которая читает файл и хранит каждую строку, чей первый символ ":" и удаляет каждую черту, содержащуюся в строке. Каждый раз, когда найден этот тип линии, push_back() используется для хранения этой строки в векторе. Проблема в том, что каждый раз, когда используется push_back(), все элементы вектора принимают значение последнего. Я не понимаю, почему это происходит. Здесь код:
string listContent;
size_t dashPos;
vector<char*>cTagsList;
while(!SFHlist.eof())
{
getline(SFHlist,listContent);
if(listContent[0]==':')
{
listContent.erase(0,1);
dashPos = listContent.rfind("-",string::npos);
while(dashPos!=string::npos)
{
listContent.pop_back();
dashPos = listContent.rfind("-",string::npos);
}
char* c_listContent = (char*)listContent.c_str();
cTagsList.push_back(c_listContent);
}
}
Сначала я думал, что это проблема с концом файла, но прерывание процесса поиска до достижения этой точки дает те же результаты.
c_str() -method состояний std :: string:
Возвращаемый указатель может быть аннулирован дальнейшими вызовами других функций-членов, которые изменяют объект.
Если вам разрешено использовать std :: vector <std :: string> вместо вектора char *, вы в порядке, так как всегда будет копия std :: string listContent, введенная в вектор, т.е.,
std::string listContent;
size_t dashPos;
std::vector<std::string>cTagsList;
while(!SFHlist.eof())
{
getline(SFHlist,listContent);
if(listContent[0]==':')
{
listContent.erase(0,1);
dashPos = listContent.rfind("-",string::npos);
while(dashPos!=string::npos)
{
listContent.pop_back();
dashPos = listContent.rfind("-",string::npos);
}
cTagsList.push_back(listContent);
}
}
(Я его не тестировал)
while (!eof())
не так. Во-вторых, приведение результатаc_str
кchar *
очень плохо. В-третьих, этот указатель недействителен, как только вы измените строку, что происходит сразу после. Используйте вектор изstd::string
. В любом случае, вы не удаляете каждую черту, вы удаляете все после, включая первую черту. Используйтеstd::remove
и соедините его сerase
.c_str
! Вместо этого просто сделайтеstd::vector<std::string> cTagsList;
вместо этого и простоcTagsList.push_back(listContent);