《面向对象程序设计》第五次作业(指定路径读取计算表达式+项目框架图)

作业要求:

  • 如果第一个参数为表达式,只输出表达式的结果;
  • 如果第一个参数为“-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,'
');

			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包括了输出一个回车" "和flush

调试截图


(以及一个不太懂是什么的框架图)

参考资料:
C++读写文件总结
ofstream(不会就查API不会就查API不会就查API!!)

原文地址:https://www.cnblogs.com/thousfeet/p/5475725.html