为什么需要将某些内容返回到输入流?

时间:2016-03-15 04:23:58

标签: c++

该代码用于创建一个功能正常的计算器程序。整个事情有点长,所以我不会进入所有这一切,但这里有一部分:

Token Token_stream::get()
{
    if (full) { // do we already have a Token ready?
        full = false; // remove Token from buffer
        return buffer;
    }
    char ch;
    cin >> ch; // note that >> skips whitespace (space, newline, tab, etc.)

    switch (ch) {
        case ';': // for “print”
        case 'q': // for “quit”
        case '(': case ')': case '+': case '–': case '*': case '/':
            return Token{ch}; // let each character represent itself
        case '.':
        case '0': case '1': case '2': case '3': case '4':
        case '5': case '6': case '7': case '8': case '9':
        {   
            cin.putback(ch); // put digit back into the input stream
            double val;
            cin >> val; // read a floating-point number
            return Token{'8',val}; // let ‘8’ represent “a number”
        }
        default:
            error("Bad token");

    }
}

为什么需要将ch放回输入流?你不能只使用ch输入而不是使用一个全新的val变量吗?

1 个答案:

答案 0 :(得分:3)

是的,有可能。但是,仍有更多数据需要处理。到目前为止,ch将只有第一个数字。

例如,如果阅读输入123,则'1'字符将被读入ch。从那里,'1'将被放回输入,然后整个数字123将被读入val。如果未调用cin.putback(ch);,则返回的Token将具有值23而不是123

另一种选择是使用ch中的值,然后以该方式读取其余数字。然而,作者的意图是使用更安全和已经制作的方法来阅读double