我正在改变一个评估表达式的(好吧,我的第一个)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 ++更简单的东西并从那里建立......
答案 0 :(得分:0)
让我们从这个
开始cin >> paren;
expression = SubExpression::parse();
cin >> comma;
此代码从cin(终端)读取单个字符,然后调用parse,然后读取另一个单个字符。它永远不会读你的表达。它也永远不会对两个单个字符做任何事情,它只会把它们扔掉。
这告诉我,从终端读取表达式的代码在SubExpression::parse()
中 - 该代码(您未显示)显然直接从cin读取。
这直接表明你的所有尝试都失败了 - 你的表达式是文件或字符串,但你的解析例程仍然固执地从cin读取。您需要将该例程更改为从其他位置读取。