I have the following code that parses a text file and indexes words and lines:
bool Database::addFromFileToListAndIndex(string path, BSTIndex* & index, list<Line *> & myList) { bool result = false; ifstream txtFile; txtFile.open(path, ifstream::in); char line[200]; Line * ln; //if path is valid AND is not already in the list then add it if(txtFile.is_open() && (find(textFilePaths.begin(), textFilePaths.end(), path) == textFilePaths.end())) //the path is valid { //Add the path to the list of file paths textFilePaths.push_back(path); int lineNumber = 1; while(!txtFile.eof()) { txtFile.getline(line, 200); ln = new Line(line, path, lineNumber); if(ln->getLine() != "") { lineNumber++; myList.push_back(ln); vector<string> words = lineParser(ln); for(unsigned int i = 0; i < words.size(); i++) { index->addWord(words[i], ln); } } } result = true; } return result; }
My code runs flawlessly and fairly quickly until I give it a HUGE text file. Then I get the error from Visual Studio. When I switch to "Release", the code runs without a hitch. Is there something wrong with my code or are there any limitations when running the Debug configuration? Am I trying to do too much in one function? If so, how can I break it so that it does not break during debugging?
EDIT Upon request, my addWord implementation;
void BSTIndex::addWord(BSTIndexNode *& pCurrentRoot, string word, Line * pLine) { if(pCurrentRoot == NULL) //BST is empty { BSTIndexNode * nodeToAdd = new BSTIndexNode(); nodeToAdd->word = word; nodeToAdd->pData = pLine; pCurrentRoot = nodeToAdd; return; } //BST not empty if (word < (pCurrentRoot->word)) //Go left { addWord(pCurrentRoot->pLeft, word, pLine); } else //Go right { addWord(pCurrentRoot->pRight, word, pLine); } }
And lineParser:
vector<string> Database::lineParser(Line * ln) //Parses a line and returns a vector of the words it contains { vector<string> result; string word; string line = ln->getLine(); //Regular Expression, matches anything that is not a letter, number, whitespace, or apostrophe tr1::regex regEx("[^A-Za-z0-9\\s\\']"); //Using regEx above, replaces all non matching characters with nothing, essentially removing them. line = tr1::regex_replace(line, regEx, std::string("")); istringstream iss(line); while(iss >> word) { word = getLowercaseWord(word); result.push_back(word); } return result; }