第五次作业(文件处理)
在写博客之前呢,我先说说我这次作业的准备,首先就是文件的处理问题,在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类里面的queue
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:即为这篇博客的步骤).
做完本次作业的感受:作业看似很难,但是当我们理解完题目,然后在入手的话,那就不难了。所以,我们在做一件事时,就该先明白做这件事情的用途。努力了!!!。