使用C ++

时间:2017-05-04 19:32:28

标签: c++

我正在改变一个评估表达式的(好吧,我的第一个)C ++程序。例如,通过输入:

(x + (y * 3)), x = 2, y = 6;

应该输出以下内容:

Value = 20

当用户在控制台中键入表达式时,程序会起作用,但我希望它能够从文本文件中读取和计算表达式(每个都在一个单独的行上)。我已经成功读取了文件在,甚至可以在控制台中打印其内容,但我在解析和评估每一行时遇到问题。此项目附带了更多的头文件和源文件,但我认为所有相关信息都在主函数中:

#include <iostream>
#include <string>
#include <fstream>
using namespace std;

#include "expression.h"
#include "subexpression.h"
#include "symboltable.h"
#include "parse.h"

SymbolTable symbolTable;

void parseAssignments();

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

    ifstream myfile("expressions.txt");

    if (myfile.is_open())
    {
        while (getline(myfile, program))
        {
            cout << program << '\n'; //confirms that file was read properly

            //code to parse expressions and print results
        }
        myfile.close();
    }
    else cout << "Unable to open file";

    //original code that parses expression the user inputs
    /*cout << "Enter expression: ";
    cin >> paren;
    expression = SubExpression::parse();
    cin >> comma;
    parseAssignments();
    cout << "Value = " << expression->evaluate() << end1;*/

    cin.get(); //added this so the window doesn't close automatically
    return 0;
}

在过去的几天里,我尝试了很多方法,我认为这归结于我对C ++在这两行中究竟发生了什么的无知。我的理论是它解析第一行中括号右边的所有内容,以及第二行中逗号右边的所有内容(忽略范围重叠的事实)。

    cin >> paren;
    cin >> comma;

因此,在其他方法中,我尝试在while循环中包含以下内容。我正在使用MS Visual Studio,当我点击“&gt;本地Windows调试器”时,它将打开一个控制台窗口,其中第一个表达式已打印,并且一条闪烁的行正在等待我输入内容。我关闭窗口,而不是“&gt;继续”代替“&gt;本地Windows调试器”它将结束该程序。完全有可能我只是错误地使用Visual Studio。

myfile >> paren;
expression = SubExpression::parse();
myfile >> comma;
parseAssignments();
cout << "Value = " << expression->evaluate();

而且:

std::istringstream iss(program);
iss >> paren;
expression = SubExpression::parse();
iss >> comma;
parseAssignments();
cout << "Value = " << expression->evaluate();

当然这是:

getline(myfile, program) >> paren;
expression = SubExpression::parse();
getline(myfile, program) >> comma;
parseAssignments();
cout << "Value = " << expression->evaluate();

我是否采取了完全错误的方法,或者更糟糕的是我是否应该专注于改变其他功能?谢谢!!

编辑:似乎在cin >>和其他一些.cpp文件中调用parse(),这阻止了我上面的三次尝试产生很大影响。现在我正在考虑将该行作为参数包含在下面的函数中。如果不起作用,我会报告任何错误。

string parseName()
{
    char alnum;
    string name = "";

    cin >> ws;
    while (isalnum(cin.peek()))
    {
        cin >> alnum;
        name += alnum;
    }
    return name;
}

编辑2 :它的工作原理!由于在整个程序中使用cin >>,我必须创建一个新的变量std::stringstream in(program);,然后将其用作函数中的参数,如下所示:

void parseAssignments(stringstream& in);

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

    ifstream myfile("expressions.txt");

    if (myfile.is_open())
    {
        while (getline(myfile, program))
        {
            cout << program << '\n'; //confirms that file was read properly

            std::stringstream in(program);
            in >> paren;
            expression = SubExpression::parse(in);
            in >> comma;
            parseAssignments(in);
            cout << "Value = " << expression->evaluate() << '\n\;
        }
        myfile.close();
    }
    else cout << "Unable to open file";

    cin.get(); //added this so the window doesn't close automatically
    return 0;
}

感谢您的帮助!我想我会回到C ++更简单的东西并从那里建立......

1 个答案:

答案 0 :(得分:0)

让我们从这个

开始
cin >> paren;
expression = SubExpression::parse();
cin >> comma;

此代码从cin(终端)读取单个字符,然后调用parse,然后读取另一个单个字符。它永远不会读你的表达。它也永远不会对两个单个字符做任何事情,它只会把它们扔掉。

这告诉我,从终端读取表达式的代码在SubExpression::parse()中 - 该代码(您未显示)显然直接从cin读取。

这直接表明你的所有尝试都失败了 - 你的表达式是文件或字符串,但你的解析例程仍然固执地从cin读取。您需要将该例程更改为从其他位置读取。