天天看點

面向對象程式設計第五次作業

增加輸入方式

電腦第三步:檔案讀取

  • github連結:https://github.com/H-BING/object-oriented/tree/master/Calculator

0、 運作效果

面向對象程式設計第五次作業

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、 描述架構圖

面向對象程式設計第五次作業

4、 題外話:沒想到你是這樣的VS

  • 這次作業雖然不難,但是調試了好久(o_ _)調試時間是寫代碼的好幾倍...
  • 對此,我隻想說:珍愛生命,遠離VS!!!
  • 不懂VS為什麼會有迷之bug
  • 考試前我看看了資料,了解的差不多之後。大概架構寫好後,考完試再寫一寫就基本差不多了。寫好之後用指令行試了一下隻需要輸出結果的資料,竟然出現下面這個錯誤,再試-a也報錯。
    面向對象程式設計第五次作業
  • 原本以為是自己改代碼的時候哪裡不小心改錯了,看了好一會沒看出什麼。不小心關了VS再開,發現-a和隻輸出結果的兩種方式竟然可以運作了...當時還沒有覺得有什麼。
  • 然後!!用-f方式輸出的還是被報錯,我又跑去認認真真的看了看資料,找不出什麼問題啊...找了找已經貼出部落格的同學,看了他們的代碼,挑了個和我最像的跟着改了改,還是報錯orz
  • 接下來就開始了我的求助之路:我把代碼截圖給學霸,然而學霸看過之後表示看不出什麼問題...我就在學霸的指導下開始苦哈哈的測試。
  • 最開始的代碼
    面向對象程式設計第五次作業
  • 最後把有關檔案讀取的部分單獨取出來,在新的項目裡進行測試,發現沒有問題...再回到電腦項目裡面,有關檔案讀取的部分,一行一行注釋掉進行調試。
  • 結果發現,竟!然!都!可!以!竟!然!沒!有!報!錯!
  • 最後,我把所有注釋掉的部分都還原,發現,竟!然!可!以!了!
  • 整個人都斯巴達了!明明什麼都沒有改過!
  • 可以運作的代碼(除了圖檔顯示的地方,其他地方都沒有改過啊...)
    面向對象程式設計第五次作業
  • 不帶這樣玩我的 (# ̄~ ̄#) 沒有錯誤為什麼還報錯...後來思考了很久,發現是在我關掉計算機項目再打開它後,又可以了...想想再早一點也出現過這樣的情況...當時沒有這麼執着,是第二天再開發現沒有問題了
  • 忠告:使用VS如果出現迷之報錯,請重新打開項目進行嘗試...如果繼續報錯,那應該就是代碼的問題了

5、 參考資料

  • 檔案讀寫
    • http://blog.csdn.net/kingstar158/article/details/6859379
    • http://jingyan.baidu.com/article/b24f6c82dbdccc86bee5da65.html
  • C++ string, char 的互相轉換*
    • http://www.cnblogs.com/zhixing/archive/2013/06/04/3116814.html