如何获取递归函数中的下一行

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) ) {
        // ...

}