如何获取递归函数中的下一行
How to get the next line in a recursive function
我正在尝试创建一个递归函数,它将遍历一个文件,并为每一行创建一个对象的实例,为该对象指定名称、属性列表和以前的名称 (所有的名字都是独一无二的,所以我不需要担心相似之处)。
代码如下:
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"
你的第一个问题是你的递归没有基本情况(即终止条件),所以 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) ) {
// ...
}
我正在尝试创建一个递归函数,它将遍历一个文件,并为每一行创建一个对象的实例,为该对象指定名称、属性列表和以前的名称 (所有的名字都是独一无二的,所以我不需要担心相似之处)。
代码如下:
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"
你的第一个问题是你的递归没有基本情况(即终止条件),所以 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) ) {
// ...
}