面向对象程序设计第五次作业

计算器第三步:文件读取


0、 运行效果

885954-20160510005101171-1843984247.png


1、 准备

  • 之前基本上没怎么用过文件来进行数据的输入与输出,这次作业也算是涨姿势了( ̄︶ ̄)
  • 以前接触过freopen,这次本来想用的 0 0 输进去后freopen被VS报错了,提示要用freopen_s。这让我想起来了心酸的scanf_s (o_ _) 还是默默的去百度了c++的文件读取方法。
  • 文件读取的写法感觉没什么太大的区别吧 0 0 也没有什么太难的 0 0 写法基本上就是固定的。

2、 代码

  • main

     //主函数
     int main(int argc, char* argv[])
     {
         string sInput;
         bool bIs_a = false;//标记是否输入-a
    
         Print print;
         string text_txt, result_txt;
    
         int i;
         for (i = 1; i < argc; i++) 
         {
             sInput = argv[i];
    
             //标记为-a方式输出
             if (sInput == "-a") 
             {
                 bIs_a = !bIs_a;
             }
             //以文件输出
             else if (sInput == "-f") 
             {
                 text_txt = argv[++i];
                 result_txt = argv[++i];
    
                 print.ToPrintIs_f(text_txt, result_txt);
             }
             //以非文件输出
             else 
             {
                 print.ToPrintIsNot_f(sInput, bIs_a);
             }
    
             sInput.clear();
         }
    
         return 0;
     }

  • Print.cpp

     //以非文件方式输出结果
     void Print::ToPrintIsNot_f(string sInput, bool bIs_a)
     {
         Scan scan;
         Calculation calculate;
    
         //拆分表达式
         scan.ToStringQueue(sInput);
    
         //计算表达式的值
         calculate.ToCalculate(scan.q);
    
         //以-a方式输出
         if (bIs_a)
         {
             cout << sInput << "= ";
         }
    
         cout << calculate.m_dResult << endl;
     }
    
     //以文件方式输出结果
     void Print::ToPrintIs_f(string sText_txt, string sResult_txt) 
     {        
         ifstream in;
         ofstream out;
    
         //打开文件
         in.open(sText_txt.c_str(), ios::in);
         out.open(sResult_txt.c_str(), ios::out);
    
         while (!in.eof())
         {
             Scan scan;
             Calculation calculate;
             string sExperssion;
    
             //从sText_txt路径获取数据
             getline(in, sExperssion, '\n');
    
             //拆分表达式
             scan.ToStringQueue(sExperssion);
    
    
             //计算表达式的值
             calculate.ToCalculate(scan.q);
    
             //在sResult_txt路径下输出结果
             out << calculate.m_dResult << endl;
         }
    
         //关闭文件
         in.close();
         out.close();
     }

3、 描述框架图

885954-20160510221231390-482154319.png


4、 题外话:没想到你是这样的VS

  • 这次作业虽然不难,但是调试了好久(o_ _)调试时间是写代码的好几倍...
  • 对此,我只想说:珍爱生命,远离VS!!!
  • 不懂VS为什么会有迷之bug
  • 考试前我看看了资料,了解的差不多之后。大概框架写好后,考完试再写一写就基本差不多了。写好之后用命令行试了一下只需要输出结果的数据,竟然出现下面这个错误,再试-a也报错。
    885954-20160510000355984-709998351.png
  • 原本以为是自己改代码的时候哪里不小心改错了,看了好一会没看出什么。不小心关了VS再开,发现-a和只输出结果的两种方式竟然可以运行了...当时还没有觉得有什么。
  • 然后!!用-f方式输出的还是被报错,我又跑去认认真真的看了看资料,找不出什么问题啊...找了找已经贴出博客的同学,看了他们的代码,挑了个和我最像的跟着改了改,还是报错orz
  • 接下来就开始了我的求助之路:我把代码截图给学霸,然而学霸看过之后表示看不出什么问题...我就在学霸的指导下开始苦哈哈的测试。
  • 最开始的代码
    885954-20160510000415671-650986370.png
  • 最后把有关文件读取的部分单独取出来,在新的项目里进行测试,发现没有问题...再回到计算器项目里面,有关文件读取的部分,一行一行注释掉进行调试。
  • 结果发现,竟!然!都!可!以!竟!然!没!有!报!错!
  • 最后,我把所有注释掉的部分都还原,发现,竟!然!可!以!了!
  • 整个人都斯巴达了!明明什么都没有改过!
  • 可以运行的代码(除了图片显示的地方,其他地方都没有改过啊...)
    885954-20160510000711421-326318172.png
  • 不带这样玩我的 (# ̄~ ̄#) 没有错误为什么还报错...后来思考了很久,发现是在我关掉计算机项目再打开它后,又可以了...想想再早一点也出现过这样的情况...当时没有这么执着,是第二天再开发现没有问题了
  • 忠告:使用VS如果出现迷之报错,请重新打开项目进行尝试...如果继续报错,那应该就是代码的问题了

5、 参考资料

转载于:https://www.cnblogs.com/HBING/p/5475739.html

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值