《面向对象程序设计》第五次作业(指定路径读取计算表达式+项目框架图)
作业要求:
- 如果第一个参数为表达式,只输出表达式的结果;
- 如果第一个参数为“-a”,第二个为表达式,将表达式输出;
- 如果第一个参数为“-f”,第二个为txt文件的路径,则从该文件中读取表达式(每个表达式一行,有多行),并将答案输出到第三个参数的路径上
前两个要求在上次作业已经实现,这次其实只要实现第三个功能。
主要代码:
step1:读取和判断
string read;
bool flag1 = false,flag2 = false,flag3 = false;
//参数有-a
if(strcmp(argv[1],"-a") == 0)
{
read = argv[2];
flag2 = true;
}
//参数有-f
else if(strcmp(argv[1],"-f") == 0)
{
flag3 = true;
}
//无指定类型参数
else
{
read = argv[1];
flag1= true;
}
step2:计算
//读写文件方式计算输出
if(flag3)
{
ifstream fin(argv[2]);
while(!fin.eof())
{
getline(fin,read,'\n');
q = scan->ToStringQueue(read); //获取目标队列
Calculation *calculation = new Calculation(q);
calculation->trans(q); //转化为后缀表达式
theResult = calculation->calcu();
print->fPrint(argv[3],theResult);//输出结果
delete(calculation);
}
fin.close();
}
//直接打印输出
else
{
q = scan->ToStringQueue(read); //获取目标队列
Calculation *calculation = new Calculation(q);
calculation->trans(q); //转化为后缀表达式
theResult = calculation->calcu();
//直接输出运算结果
if(flag1)
{
print->nPrint(theResult);
}
//输出表达式和运算结果
else if(flag2)
{
print->aPrint(argv[2],theResult);
}
delete(calculation);
}
step3:print类中实现输出
void Print::nPrint(double re)
{
cout << re;
}
void Print::aPrint(string s,double re)
{
cout << s <<" "<<re;
}
void Print::fPrint(char *s,double re)
{
ofstream fout(s,ofstream::app);
fout << re <<endl;
fout.close();
}
c语言中读写文件的freopen方法其实在平时打题的时候我还是蛮常用的..所以想借此机会学习一下c++读写文件的方式,fstream库函数。虽然正是因为初学花了蛮多时间调试各种,但也还是有了一定的收获w
1.学习了ftream的一些基本的输入输出流用法,代码中是定义ifstream和ofstream对象直接实现,(看别处的代码调用open()方法的好像比较少,这样好像也更方便些所以就没有用open()..
2.在从文件中读取多行表达式的时候出现了输出结果被覆盖的问题。后面加上了ofstream:app后成功。(直接写入文件默认在文件头写入..加上app会在保留已存在的文件情况下在文件末尾写入,ate也是在文件末尾写入但没有保留已有文件内容)
3.无意中知道了flush这个东西(将缓冲区的内容马上输出并且把输出缓冲区刷新),平时用的endl包括了输出一个回车"\n"和flush
调试截图
(以及一个不太懂是什么的框架图)