`
yidongkaifa
  • 浏览: 4048632 次
文章分类
社区版块
存档分类
最新评论

C++中的Peek函数在C语言中实现

 
阅读更多

我朋友总是跟我说,C++是C的阉割版,我不反对,也不赞同。

最近项目中,遇到一个问题,就是如何在主程序运行的同时检测串口的输入,比如输入"q",退出函数。

同事推荐用C++的Peek函数,可是我从进入工作以来,在Linux项目中全部使用的是C,唯一知道去的输入的就是getchar()了.

下面首先看看C++中的Peek函数(贴自百度百科):

C++中的peek函数

  该调用形式为cin.peek() 其返回值是一个char型的字符,其返回值是指针指向的当前字符,但它只是观测,指针仍停留在当前位置,并不后移。如果要访问的字符是文件结束符,则函数值是EOF(-1)。

  其功能是从输入流中读取一个字符 但该字符并未从输入流中删除  若把输入流比作一个 栈类 那么这里的peek函数就相当于栈的成员函数front 而如果cin.get()则相当于栈的成员函数pop。

  下面这段代码能帮助您更清晰地理解peek函数

/* istream peek */
#include <iostream>
using namespace std;
int main () 
{
	char c;
	int n;
	char str[256];
	cout << "Enter a number or a word: ";
	c=cin.peek();
	if ( (c >= '0') && (c <= '9') )
	{
		cin >> n;
		cout << "You have entered number " << n << endl;
	}
	else
	{
		cin >> str;
		cout << " You have entered word " << str << endl;
	}
	return 0;
}


C中的peek函数(自己写的)

char peek_char;

static char peek()
{
	return peek_char;
}

static void * __Peek_loop_func(void *pInputArg)
{
	char tmp_char;
	while(1)
	{
		if(tmp_char=getchar())
		{			
			if((tmp_char!='\r')&&(tmp_char!='\n')&&(tmp_char!=0x0a))
			{
				peek_char=tmp_char;
				printf("Input Char === [%c] \n",peek_char);	

				if(peek_char=='q')
				{
					printf("Jmp out from serial == 2 \n");
					exit(1);
				}
			}
		}
		usleep(1000*10);
	}
}

// 下面的代码放在主程序中,用来创建检测输入的线程.

pthread_t tPeekThreadHandle;
pthread_create(&tPeekThreadHandle, NULL, &__Peek_loop_func, NULL);


原理就是创建一个新线程,来接收串口的输入,如果输入的第一字符为‘q’ 则退出程序,其实在退出的时候,我们也可以再捕获一下。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics