zoukankan      html  css  js  c++  java
  • 第五次作业(文件处理)

    第五次作业要求

    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,'
    '); //以换行符作为分界点。
    		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:即为这篇博客的步骤).

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

  • 相关阅读:
    Ajax请求过程中显示“进度”的简单实现
    Asp.net 图片文件防盗链介绍
    ASP.NET MVC验证
    MVC文件上传
    MVC文件上传-使用jQuery.FileUpload和Backload组件实现文件上传
    使用jQuery.FileUpload插件和服Backload组件自定义上传文件夹
    使用jQuery.FileUpload和Backload自定义控制器上传多个文件
    使用jQuery.FileUpload插件和Backload组件裁剪上传图片
    CSS3 多列
    CSS3 2D转换 动画
  • 原文地址:https://www.cnblogs.com/wpqf7630/p/5477370.html
Copyright © 2011-2022 走看看