我正在嘗試創建一個遞回函式,它將遍歷一個檔案,并且對于每一行,將創建一個物件的實體,給這個物件一個名稱、屬性串列和以前的名稱(所有名稱都是唯一的,所以我不需要擔心相似之處)。
這是代碼:
void getTags(string prevname){
fstream file;
file.open("source.txt");
string name;
// Getting current line, and splitting it.
string str;
getline(file, str);
cout << str << endl;
vector<string> currentLine = splitString(str, ' ');
// Getting tag name
if(!isClosing(str)){
for (int i = 1; i < (int)currentLine[0].size(); i ){
name = currentLine[0][i];
}
Tag tag = Tag(name, prevname);
if(hasAttr(str)){
vector<pair<string, string>> temp = getAttr(currentLine);
for(int i = 0; i < (int)temp.size(); i ){
tag.addAttribute(temp[i]);
}
}
tags.push_back(tag);
getTags(name);
} else {
getTags(prevname);
}
}
};
出于某種原因,我getline(file, str)沒有得到下一行,而是只是遞回,直到我遇到分段錯誤。我也試過了file >> str。但這也沒有用。
我已經嘗試列印該行以檢查它是否確實轉到下一行,但它會始終停留在第一行。
我不確定我到底哪里出錯了,任何幫助將不勝感激。
檔案中的每一行都類似于:
name value="value" value2 = "value2"
uj5u.com熱心網友回復:
您的第一個問題是您的遞回沒有基本情況(即終止條件),因此getTags在您填滿呼叫堆疊之前一直被呼叫,此時您會遇到分段違規。解決這個問題的方法是創建一個終止條件,在這種情況下,當您用盡檔案中的所有輸入時。
您的第二個問題是每個遞回呼叫都會再次打開檔案并將其分配給fstream file. 這意味著您的getline呼叫將始終讀取第一行,無論您到目前為止進行了多少次遞回呼叫(請記住,在一次遞回呼叫中定義的區域變數不會轉移到后續呼叫中)。解決此問題的一種方法是在開始遞回之前打開檔案并將fstream作為引數傳遞給getTags. 這樣,您不必多次打開檔案,并且實際上能夠正確讀取檔案。
鑒于以上兩點, 的一般結構getTags可能如下所示:
void getTags(fstream &file, string prevName) {
string line;
result = getline(file, line);
if (!result) {
// This is your base case. If result == false, the call to getline failed (due to EOF or some other reason)
return;
}
// Main function logic here...
vector<string> currentLine = splitString(line, ' ');
if (!isClosing(line) ) {
// ...
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/482928.html
上一篇:使用遞回確定嵌套函式的索引路徑
