0

我有以下代码

int main()
{
    Expression* expression;
    char paren, comma;
    string program;

    freopen("input", "r", stdin);

    while (true)
    {
        cout << "Enter expression: ";
        cin >> paren;
        expression = SubExpression::parse();
        cin >> comma;  
        parseAssignments();
        cout << "Value = " << expression->evaluate() << endl;
        if(cin.eof())
            break;
    }

    return 0;
}

void parseAssignments()
{
    char assignop, delimiter;
    string variable;
    int value;
    do
    {
        variable = parseName();
        cin >> ws >> assignop >> value >> delimiter;
        symbolTable.insert(variable, value);
    }
    while (delimiter == ',');
}

我只想使用 cin 从文件中读取多个表达式。无论我将 cin.eof() 放在 while 循环中的哪个位置,程序都会再读取一次输入,然后崩溃。我也尝试过 cin.peek() 但仍然是相同的输出。建议一种阅读EOF的方法。

4

1 回答 1

1

正如之前无数次讨论的那样,eof()永远不是正确的工具。

你要这个:

Expression * expression = nullptr;

for (char paren, comma;
     std::cin >> paren                     &&
     (expression = SubExpression::parse()) &&
     std::cin >> comma                     &&
     parseAssignments();
    )
{
    std::cout << "Value: " << expression->evaluate() << "\n";
}

在这里,我们假设两者都parse()返回parseAssignments()可以转换为true成功和false失败的东西(如空指针)。

您可能还想插入检查分隔符是否符合预期,例如paren == '('comma == ','

于 2013-05-02T18:40:49.807 回答