经常需要在GUI下面做些计算程序的测试,想很快的看到计算结果并且希望通过控制台输出来,所以找到了以下的文章。 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 注: 用关键词 "EmbeddedConsole* EmbeddedConsole::_instance;" 或者"在GUI程序中使用控制台"可以baidu到很多类似的文章。 1 何谓输入输出重定向? 默认情况下输入是由键盘输入的。输出是默认的输出到屏幕上。而输入输出重定向就是改变默认的输入输出方向。。呵呵。 2 freopen()函数 函数名:freopen 与该函数相对应的函数是 下面我们就用这两个函数来实现一下输入输出重定向
int fclose ( FILE * stream ); 返回值表示:若stream被成功关闭将返回一个0值,否则返回EOF.
这个程序实现了输出重定向,即:输出不再是默认的屏幕了,而是输出到了out.txt这个文件中。同样,用此种方法我们也可以实现输入重定向。 呵呵。掌握了这点知识,基本上就可以学南老师的那篇笔记了: 在GUI程序中使用控制台的两种方法-方法一:http://student.csdn.net/space.php?uid=112600&do=blog&id=10713 现在分析老师的笔记内容以帮助自己加深理解:
总观整个类,我们可以发现,南老师把构造函数和析构函数定义为了私有。为的是不容许我们定义一个对象,即:
我们若想定义一个EmbeddedConsole对象。只能显示的调用static void Need()函数。这也就是为啥南老师把Need函数定义为static的原因。因为我们无法获得一个对象,也就无法调用普通的成员函数(因为普通的成员函数只能通过一个对象来调用。)。同理 static void Unneed()函数也被定义为了static. 既然仅有的两个成员函数都成static了,那么它仅有的数据成员_instance也只能是static了(static成员函数只能访问static数据成员)。这两个函数的作用分别是分配一个对象,释放一个对象。但我们看到老师的Need函数里用到了这样一个判断if (!_instance).意思是如果对象已经别分配了空间。就不再进行分配。对于另一个函数Unneed().老师的实现是:
对于这个函数我觉得在delete使用之前应该进行一下判断if (_instance).即如果_instance有值.才进行删除操作。不过这样对每个对象都多了一层判断,在效率上势必会有影响。这两个函数内部调用了私有的构造函数和析构函数。进行对象的分配和释放。 好了,老师的这个类理解了,下面看看老师的实例:
这个实例就是用来测试刚才定义哪个类。来实现输入输出重定向。在用户点击test按钮的时候:
调用static function Need().来申请一个对象,申请对象的同时也申请了一个控制台。并重定向了stream。 在用户点击quit按钮的时候,操作很简单,关闭对话框,然后释放控制台和关闭流。通过学习南老师的这篇笔记又了解了另一种输入输出重定向。但却偏 离了南老师的愿意,南老师的这个例子是教我们一种GUI程序的调试方法。不过我们确实可以通过它了解一下输入输出重定向。。谢谢南老师。继续关注南老师的 笔记。 下面我们接着看输入输出重定向: 先看一个简单的输入重定向的例子:
这个例子简单的进行了输入重定向,cin >> a >> b;不再是有键盘输入a,b的值,而是程序自动从文件里进行读取。这里我们还可以了解另外一个知识:宏。 #ifdef ONLINE_JUDGE #else #endif 宏的这种使用方法对于调试也是很有用的。即若是我们定义了ONLINE_JUDGE.就不进行输入输出重定向。a,b的值将由我们由键盘给出。否则将从文件中读取a,b的值。我们想改变方式只需简简单单的一个#define ONLINE_JUDGE就OK啦。。呵呵。据说做软件的时候也经常用到这种方法。 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 *//////////////////////////////////////////////////////////// |
|