經(jīng)常需要在GUI下面做些計(jì)算程序的測試,,想很快的看到計(jì)算結(jié)果并且希望通過控制臺(tái)輸出來,所以找到了以下的文章,。 reference: http://blog.csdn.net/wangfutao01/article/details/6473498 http://blog.csdn.net/nanyu/article/details/6473435 http://blog.csdn.net/nanyu/article/details/6474939 http://lgy-047.blog.163.com/blog/static/613465652009112672118305/ http://blog.csdn.net/lzhlzz/article/details/6585554 http://blog.csdn.net/lzhlzz/article/details/6585559 注: 用關(guān)鍵詞 "EmbeddedConsole* EmbeddedConsole::_instance;" 或者"在GUI程序中使用控制臺(tái)"可以baidu到很多類似的文章。 1 何謂輸入輸出重定向? 默認(rèn)情況下輸入是由鍵盤輸入的,。輸出是默認(rèn)的輸出到屏幕上,。而輸入輸出重定向就是改變默認(rèn)的輸入輸出方向。,。呵呵,。 2 freopen()函數(shù) 函數(shù)名:freopen 與該函數(shù)相對(duì)應(yīng)的函數(shù)是 下面我們就用這兩個(gè)函數(shù)來實(shí)現(xiàn)一下輸入輸出重定向
int fclose ( FILE * stream ); 返回值表示:若stream被成功關(guān)閉將返回一個(gè)0值,否則返回EOF.
這個(gè)程序?qū)崿F(xiàn)了輸出重定向,,即:輸出不再是默認(rèn)的屏幕了,,而是輸出到了out.txt這個(gè)文件中。同樣,,用此種方法我們也可以實(shí)現(xiàn)輸入重定向,。 呵呵。掌握了這點(diǎn)知識(shí),,基本上就可以學(xué)南老師的那篇筆記了: 在GUI程序中使用控制臺(tái)的兩種方法-方法一:http://student.csdn.net/space.php?uid=112600&do=blog&id=10713 現(xiàn)在分析老師的筆記內(nèi)容以幫助自己加深理解:
總觀整個(gè)類,,我們可以發(fā)現(xiàn),南老師把構(gòu)造函數(shù)和析構(gòu)函數(shù)定義為了私有,。為的是不容許我們定義一個(gè)對(duì)象,即:
我們?nèi)粝攵x一個(gè)EmbeddedConsole對(duì)象,。只能顯示的調(diào)用static void Need()函數(shù)。這也就是為啥南老師把Need函數(shù)定義為static的原因,。因?yàn)槲覀儫o法獲得一個(gè)對(duì)象,,也就無法調(diào)用普通的成員函數(shù)(因?yàn)槠胀ǖ某蓡T函數(shù)只能通過一個(gè)對(duì)象來調(diào)用。),。同理 static void Unneed()函數(shù)也被定義為了static. 既然僅有的兩個(gè)成員函數(shù)都成static了,,那么它僅有的數(shù)據(jù)成員_instance也只能是static了(static成員函數(shù)只能訪問static數(shù)據(jù)成員)。這兩個(gè)函數(shù)的作用分別是分配一個(gè)對(duì)象,,釋放一個(gè)對(duì)象,。但我們看到老師的Need函數(shù)里用到了這樣一個(gè)判斷if (!_instance).意思是如果對(duì)象已經(jīng)別分配了空間。就不再進(jìn)行分配,。對(duì)于另一個(gè)函數(shù)Unneed().老師的實(shí)現(xiàn)是:
對(duì)于這個(gè)函數(shù)我覺得在delete使用之前應(yīng)該進(jìn)行一下判斷if (_instance).即如果_instance有值.才進(jìn)行刪除操作,。不過這樣對(duì)每個(gè)對(duì)象都多了一層判斷,在效率上勢必會(huì)有影響,。這兩個(gè)函數(shù)內(nèi)部調(diào)用了私有的構(gòu)造函數(shù)和析構(gòu)函數(shù),。進(jìn)行對(duì)象的分配和釋放。 好了,,老師的這個(gè)類理解了,,下面看看老師的實(shí)例:
這個(gè)實(shí)例就是用來測試剛才定義哪個(gè)類,。來實(shí)現(xiàn)輸入輸出重定向。在用戶點(diǎn)擊test按鈕的時(shí)候:
調(diào)用static function Need().來申請(qǐng)一個(gè)對(duì)象,,申請(qǐng)對(duì)象的同時(shí)也申請(qǐng)了一個(gè)控制臺(tái)。并重定向了stream,。 在用戶點(diǎn)擊quit按鈕的時(shí)候,,操作很簡單,,關(guān)閉對(duì)話框,然后釋放控制臺(tái)和關(guān)閉流,。通過學(xué)習(xí)南老師的這篇筆記又了解了另一種輸入輸出重定向,。但卻偏 離了南老師的愿意,南老師的這個(gè)例子是教我們一種GUI程序的調(diào)試方法,。不過我們確實(shí)可以通過它了解一下輸入輸出重定向,。。謝謝南老師,。繼續(xù)關(guān)注南老師的 筆記,。 下面我們接著看輸入輸出重定向: 先看一個(gè)簡單的輸入重定向的例子:
這個(gè)例子簡單的進(jìn)行了輸入重定向,cin >> a >> b,;不再是有鍵盤輸入a,b的值,,而是程序自動(dòng)從文件里進(jìn)行讀取。這里我們還可以了解另外一個(gè)知識(shí):宏,。 #ifdef ONLINE_JUDGE #else #endif 宏的這種使用方法對(duì)于調(diào)試也是很有用的,。即若是我們定義了ONLINE_JUDGE.就不進(jìn)行輸入輸出重定向。a,b的值將由我們由鍵盤給出,。否則將從文件中讀取a,b的值,。我們想改變方式只需簡簡單單的一個(gè)#define ONLINE_JUDGE就OK啦。,。呵呵,。據(jù)說做軟件的時(shí)候也經(jīng)常用到這種方法。 willor 注:我自己修改后的文件: .h頭文件 EmbeddedConsole.h #pragma once struct EmbeddedConsole { public: static void Need() { if (!_instance) { _instance = new EmbeddedConsole; } } static void Unneed() { delete _instance; _instance = 0; } private: EmbeddedConsole() { AllocConsole(); SetConsoleTitle("Console in GUI Windows..."); freopen("conin$", "r+t", stdin); freopen("conout$", "w+t", stdout); freopen("conout$", "w+t", stderr); } ~EmbeddedConsole() { fclose(stderr); fclose(stdout); fclose(stdin); FreeConsole(); } static EmbeddedConsole* _instance; }; .cpp文件 EmbeddedConsole.cpp #include "StdAfx.h" #include "EmbeddedConsole.h" EmbeddedConsole* EmbeddedConsole::_instance; /*********************************************************** Usage: There could be only one EmbeddedConsole for one program in parallel. You could release one then enable a new one, but can not enable more than one at one time. below are the steps to make use this: 1. #include "EmbeddedConsole.h" 2. EmbeddedConsole::Need(); //enable the EmbeddedConsole 3. cout your content to screen. 4. EmbeddedConsole::Unneed(); //release the EmbeddedConsole *//////////////////////////////////////////////////////////// |
|