首页 > 解决方案 > 在方法中引用我正在阅读的流

问题描述

我在一个名为 的方法中total_parsing,并创建了一个局部变量 istringstream stream(to_analize)to_analize我必须分析的字符串在哪里)。

当我到达特殊字符 (或者 [ 我想声明一个方法时reading_between_bracket,该方法将字符串从左括号读取到右括号。在那之后,我希望该方法reading_between_bracket让我有可能继续阅读全部解析。我需要一种读取括号中字符串的方法,因为我想在每次到达括号时递归地声明它。该字符串采用示例的格式。

例子 -( B + D -( ( G*F) -H )))

void total_parsing(string to_analize) {
  istrinstream stream(to_analize);
  do {
    // DO OTHER OPERATION WITHOUT BRACKET
    if (token == "(" || !token.find('(')) {
      stream = reading_between_bracket(stream);
    }
  } while (stream >> token);
}

istringstream reading_between_bracket(istringstream stream) {
  // DO THE OPERATION BETWEEN BRACKET
  // RECURSIVE CALL OF THIS METHOD IF I REACH A BRACKET,RETURN THE STREAM
  return stream(or a pointer that make possible to continue reading);
}

PS 我必须使用 C++11,我可以使用 STL 和 sstream。

描述中的代码不起作用

标签: c++referenceistringstream

解决方案


该代码不起作用,因为按值传递需要进行复制,并且可能无法复制字符串流对象另请参阅

因此,改为通过引用传递流:

void parse(string input){
    istringstream stream(input);
    string token;
    while (stream >> token) {
        if (is_open_bracket(token)) {
            parse_inside_brackets(stream);
        }
    }
}

void parse_inside_brackets(istringstream& stream) {
    // notice the '&'
    // do some processing here; the stream's internal position is updated
    // there is no need to return anything; the change to `stream` will be
    // reflected in the caller
}

要完成您描述的递归,您可能需要更多类似的东西:

void parse(string input) { // helper function to set up recursion
    parse_rec(istringstream(input), 0);
}

void parse_rec(istringstream& stream, int level) {
    // 'level' param indicates how many nested brackets we've seen
    string token;
    while (stream >> token) {
        if (is_close_bracket(token) { return; }
        else if (is_open_bracket(token)) {
            parse_rec(stream, level + 1);
        }
        else {
            // handle token at this level
        }
    }
    // If we get here, we ran out of tokens. So if we're not at the base level...
    if (level) {
        // ... then we had an unmatched bracket, so do error handling
    }
}

(但您可能应该阅读更复杂的解析技术:)另一方面,如果您可以使用这种方法处理任务,那么也许您甚至不需要递归,只需跟踪缩进级别。)


推荐阅读