久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

在GUI程序中使用控制臺(tái)的兩種方法

 willor 2013-08-01
經(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
聲明:FILE *freopen( const char *path, const char *mode, FILE *stream );
所在文件: stdio.h
參數(shù)說明:
path:
文件名,用于存儲(chǔ)輸入輸出的自定義文件名,。
mode:
文件打開的模式,。和fopen中的模式(如r-只讀, w-寫)相同。
stream:
一個(gè)文件,,通常使用標(biāo)準(zhǔn)流文件,。
返回值:成功,則返回一個(gè)path所指定文件的指針,;失敗,,返回NULL,。(一般可以不使用它的返回值)

與該函數(shù)相對(duì)應(yīng)的函數(shù)是

下面我們就用這兩個(gè)函數(shù)來實(shí)現(xiàn)一下輸入輸出重定向

 

int fclose ( FILE * stream );
返回值表示:若stream被成功關(guān)閉將返回一個(gè)0值,否則返回EOF.
Code:
  1. #include <iostream>   
  2. #include <string>   
  3. using namespace std;   
  4. int main()   
  5. {   
  6.    freopen("out.txt","w",stdout);   
  7.    string str;   
  8.    while (cin >> str)   
  9.    cout << str << endl;   
  10.    fclose(stdout);   
  11.     return 0;   
  12. }  

這個(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)容以幫助自己加深理解:

Code:
  1. struct EmbeddedConsole      
  2. {      
  3. public:          
  4.     static void Need()    //define a function to malloc  a object   
  5.     {      
  6.             
  7.   
  8.         if (!_instance)      
  9.         {      
  10.             _instance = new EmbeddedConsole;      
  11.         }      
  12.             
  13.   
  14.     }      
  15.           
  16.     static void Unneed()   // release a object.   
  17.     {      
  18.         delete _instance;      
  19.         _instance = 0;      
  20.     }      
  21.           
  22. private:      
  23.     EmbeddedConsole()    //construct.   
  24.     {      
  25.         AllocConsole();      
  26.               
  27.         SetConsoleTitle("XXX程序內(nèi)嵌測試控制臺(tái)");      
  28.               
  29.         freopen("conin$""r+t", stdin);    // in redirect.   
  30.         freopen("conout$""w+t", stdout);   // out redirect   
  31.         freopen("conout$""w+t", stderr);     // err redirect   
  32.     }      
  33.           
  34.     ~EmbeddedConsole()   //destructor   
  35.     {      
  36.         fclose(stderr);   //release.   
  37.         fclose(stdout);      
  38.         fclose(stdin);      
  39.               
  40.         FreeConsole();      
  41.     }      
  42.           
  43.     static EmbeddedConsole* _instance;    // a static data member.   
  44. };      
  45.       
  46. EmbeddedConsole* EmbeddedConsole::_instance;   // the definition of the static member  

 總觀整個(gè)類,,我們可以發(fā)現(xiàn),南老師把構(gòu)造函數(shù)和析構(gòu)函數(shù)定義為了私有,。為的是不容許我們定義一個(gè)對(duì)象,即:

Code:
  1. EmbeddedConsole obj;  // error . cannot access the private constructor  

我們?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)是:

Code:
  1. static void Unneed()      
  2. {      
  3.     delete _instance;      
  4.     _instance = 0;      
  5. }    

對(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í)例:

Code:
  1. #define WIN32_LEAN_AND_MEAN   //???不明白何用   
  2.       
  3. #include <windows.h>      
  4. #include <iostream>      
  5. #include <string>      
  6.       
  7. #include "resource.h"      
  8.       
  9. HINSTANCE hInst;   //define a HINSTANCE handle object   
  10.       
  11. //the class just define.   
  12. struct EmbeddedConsole      
  13. {      
  14. public:          
  15.     static void Need()      
  16.     {      
  17.              
  18.   
  19.         if (!_instance)      
  20.         {      
  21.             _instance = new EmbeddedConsole;      
  22.         }      
  23.            
  24.   
  25.     }      
  26.           
  27.     static void Unneed()      
  28.     {      
  29.         delete _instance;      
  30.         _instance = 0;      
  31.     }      
  32.           
  33. private:      
  34.     EmbeddedConsole()      
  35.     {      
  36.         AllocConsole();      
  37.         SetConsoleTitle("XXX程序內(nèi)嵌測試控制臺(tái)");      
  38.               
  39.         freopen("conin$""r+t", stdin);      
  40.         freopen("conout$""w+t", stdout);      
  41.         freopen("conout$""w+t", stderr);       
  42.     }      
  43.           
  44.     ~EmbeddedConsole()      
  45.     {      
  46.         fclose(stderr);      
  47.         fclose(stdout);      
  48.         fclose(stdin);      
  49.               
  50.         FreeConsole();      
  51.     }      
  52.           
  53.     static EmbeddedConsole* _instance;       
  54. };      
  55.       
  56. EmbeddedConsole* EmbeddedConsole::_instance;      
  57.       
  58. BOOL CALLBACK DialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)   // a callback function.   
  59. {      
  60.     std::string str;      
  61.           
  62.     switch (uMsg)   //deal with the message.   
  63.     {      
  64.         case WM_INITDIALOG:      
  65.             /*    
  66.              * TODO: Add code to initialize the dialog.    
  67.              */      
  68.             return TRUE;      
  69.       
  70.         case WM_CLOSE:      
  71.             EndDialog(hwndDlg, 0);      
  72.             return TRUE;      
  73.       
  74.         case WM_COMMAND:      
  75.             switch (LOWORD(wParam))      
  76.             {      
  77.                     /** TODO: Add more control ID's, when needed.    
  78.                      */      
  79.                 case IDC_BTN_QUIT:   /// a button (quit)   
  80.                     EndDialog(hwndDlg, 0);      
  81.                           
  82.                     EmbeddedConsole::Unneed(); //不要了!      
  83.                     return TRUE;      
  84.       
  85.                 case IDC_BTN_TEST:    /// a button (test)   
  86.                     EmbeddedConsole::Need(); //我要,!      
  87.                     std::cout << "please input :";      
  88.                     std::cin >> str;      
  89.                     std::cerr << str << std::endl;      
  90.                     ::MessageBox(hwndDlg, str.c_str(), "Information"      
  91.                         , MB_ICONINFORMATION);      
  92.                     return TRUE;      
  93.             }      
  94.     }      
  95.       
  96.     return FALSE;      
  97. }      
  98.       
  99.       
  100. int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)      
  101. {      
  102.     hInst = hInstance;      
  103.       
  104.     // The user interface is a modal dialog box      
  105.     return DialogBox(hInstance, MAKEINTRESOURCE(DLG_MAIN), NULL, (DLGPROC)DialogProc);      
  106. }    

這個(gè)實(shí)例就是用來測試剛才定義哪個(gè)類,。來實(shí)現(xiàn)輸入輸出重定向。在用戶點(diǎn)擊test按鈕的時(shí)候:

Code:
  1. case IDC_BTN_TEST:      
  2.     EmbeddedConsole::Need(); //我要,!      
  3.     std::cout << "please input :";      
  4.     std::cin >> str;      
  5.     std::cerr << str << std::endl;      
  6.     ::MessageBox(hwndDlg, str.c_str(), "Information"      
  7.         , MB_ICONINFORMATION);      
  8.     return TRUE;     

調(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è)簡單的輸入重定向的例子:

Code:
  1. #include <cstdio>    
  2.   
  3. #include <iostream>    
  4.   
  5. using namespace std;   
  6.   
  7. int main()    
  8.   
  9. {    
  10.   
  11. #ifdef ONLINE_JUDGE   
  12.   
  13. #else   
  14.   
  15.     freopen("in.txt","r",stdin);   
  16.   
  17. #endif   
  18.   
  19.     int a,b;   
  20.   
  21.     while(cin>>a>>b)   
  22.   
  23.         cout<<a+b<<endl;   
  24.   
  25.     return 0;   
  26.   
  27. }   

這個(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

*////////////////////////////////////////////////////////////

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購買等信息,,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請(qǐng)點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多