проверка векторных данных - PullRequest
0 голосов
/ 26 февраля 2012

Привет, есть функция, которая читает из текстового файла построчно каждую строку. Я выполняю некоторые операции над ней, подставляя строку ... и т. Д.

, затем я возвращаю эту строку обратно в вектор

* 1004.* это мой класс в Parser.h
class Parser
{// start class
public:
vector<const char*> patterns;

Parser();
~Parser(); 
void RuleParser(const char *TextFileName); // this is the function that takes the file name

private:
};// end class

сегмент из функции RuleParser

 std::ifstream ifs(TextFileName);
 while (!ifs.eof()) 
 {
 .
 .modification code
 .
 patterns.push_back((buildString).c_str()); //buildString is the modified line
 cout << buildString << endl;
 }

, но когда я пытаюсь проверить, правильны ли данные в векторе, выводится совершенно иначеданные.Я даже поставил cout после push_back, чтобы проверить его целостность, но я обнаружил, что buildString верна ... это данные при каждом нажатии ... что я делаю неправильно.

вот цикл, который я использую дляпроверить правильность моих данных.

for (int i = 0;i < patterns.size() ;i++)
{
cout << patterns.at(i) << endl;
}

1 Ответ

0 голосов
/ 26 февраля 2012

Шаблоны скважин - это набор указателей, поэтому в конечном итоге вы нажимаете указатель на одну и ту же buildString в каждой итерации цикла, а не push_back'из содержимого строки.Затем, когда buildString изменится в следующей итерации цикла, указатель станет недействительным, но он все еще останется в шаблонах - не хорошо

Я предлагаю вам объявить шаблоны как:

vector<std::string> patterns;

Таким образом,do:

patterns.push_back(buildString.c_str()) 

содержимое строки будет скопировано вместо указателя и останется действительным во время обработки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...