第五次作业(文件处理)

第五次作业要求

github enter

第四次作业参考

在写博客之前呢,我先说说我这次作业的准备,首先就是文件的处理问题,在c程序设计语言里,我们就已经了解了文件的处理,在c++里我们可以用fstream ifstream和ofstream,这些我是在网上了解的。C++文件操作详解。在这些的基础上和前几次做的计算器的基础上,完成了这次作业。
( 参考:
文件读写 还有以下些内容参考

PS:在该次作业中还改了一些以前的未发现的bug,还有输出"ERROR"的操作。

这次作业的步骤:

1、在主函数里面先做是否做文件处理的判断,如果是的话就在print类里面做文件处理,将输出的结果保存到result.txt的文件里。如果不是的话就做其他处理。

主要的代码是



	int flag=1;
	/*判断是否为文件输入*/
	if(strcmp(argv[1],"-f")==0)
	{
		string text_file=argv[argc-2];  //输入文件名 也可以说路径
		string result_file=argv[argc-1];  //输出文件名 也可以说路径
		b.Filelong(text_file,result_file); //Print类里面处理文件计算的函数
	}
	else
	{
		if(strcmp(argv[1],"-a")==0)
		{
			flag=1;
			input=argv[2];
		}
		else
		{
			flag=0;
			input=argv[1];
		}
		b.Datalong(input,flag);  //Print类里面处理非文件的函数
	}


2、接下来呢,就是到Print类里面输出处理了,当传进的是要做文件处理的时候,我们在Print类里面Filelong函数就是来处理文件的;当传入的是非文件的时候,我们在Print类里面Datalong函数来处理。

两个函数的主要代码:

Filelong函数

 

void Print::Filelong(string text_file,string result_file)
{
	ifstream iosin;      //读操作(输入)的文件类
	ofstream iosout;    //写操作(输出)的文件类
	//打开文件
	iosin.open(text_file.c_str(),ios::in);
	iosout.open(result_file.c_str(),ios::out);

	while(!iosin.eof())
	{
		string get_input;
		getline(iosin,get_input,'\n'); //以换行符作为分界点。
		que=KBS.ToStringQueue(get_input);
		double result=0;
		if(KBS.judge())
		{
			result=KBC.Calculation(que);
			//cout << get_input;
			//cout << result << endl;
			//将计算出来的值记录到文件中去。
			iosout << result << endl;
		}
		else
		{
			iosout << "ERROR" << endl;  //数据出现错误的时候我们就传入到文件的是"ERROR";
		}
	}
	//关闭文件
	iosin.close();
	iosout.close();
}


在这里我们解释下,为什么文件名后面都加了.c_str()?这是因为我们必须调用 string::c_str() 成员函数,因为 fstream 对象只接受常量字符串作为文件名。当你将文件名作为参数传递时,构造函数试图打开指定的文件。接着,我们用重载的 !操作符来检查文件的状态。故我们就都加.c_str();

Datalong函数


void Print::Datalong(string input,int flag)
{
	if(flag)
	{
		que=KBS.ToStringQueue(input);
		if(KBS.judge())
		{
			/*调用Print类中的方法输出结果;*/
			KBA.PrintStringQueue(input);
			cout << KBC.Calculation(que) << endl;
		}
		else
			cout << "ERROR" << endl;  //数据出现错误的时候我们就输出"ERROR";
	}
	else
	{
		que=KBS.ToStringQueue(input);
		if(KBS.judge())
			cout << KBC.Calculation(que) << endl;
		else
			cout << "ERROR" << endl; //数据出现错误的时候我们就输出"ERROR";
	}
}


3、在Print类里面,当我们处理字符串时,我们就得将字符串传入到Scan类里面的queueToStringQueue(string input)函数做处理,形成新队列,在做判断的过程中,若发现数据不合法要在bool judge()函数里做标记,然后直接跳出此次的循环。

4、当我们处理完字符串,我们跳转回来一个队列和一个bool值,如果bool是true时,我们就将传回来的队列在Calcu类里面的Calculation做计算,然后传入或者输出答案。当boll值是false时,我们就直接输出或者传入"ERROR"。

5、在这里Calcu类里面,我们在处理队列时,要判断是不是运算符啊,字符的优先级啊,碰到数字的时候的计算问题啊,这里我们就得运用到judge类里面的相关函数做处理,判断符号优先级时,我们要运用到operate.h里面的priority函数(ps:这不是judge类里面的函数);判断是不是字符我们就得运用到judge类里面的Punction函数;碰到数字计算问题,就得运用到judge类里面的Operate函数。

6、这些步骤后,这样一次计算就结束了。

在控制台处理文件,我们要注明好文件的输入路径和输出路径。

写好后,我们将在result.txt文件看到:

这次作业的描述框架图(ps:即为这篇博客的步骤).

做完本次作业的感受:作业看似很难,但是当我们理解完题目,然后在入手的话,那就不难了。所以,我们在做一件事时,就该先明白做这件事情的用途。努力了!!!。

posted @ 2016-05-10 12:21  Sxiaopeng  Views(202)  Comments(4Edit  收藏  举报