本文将介绍read键盘输入的详细情况,特别是关于cin.read()用于从键盘上输入字符串的相关信息。我们将通过案例分析、数据研究等多种方式,帮助您更全面地了解这个主题,同时也将涉及一些关于ACE_R
本文将介绍read 键盘输入的详细情况,特别是关于cin.read()用于从键盘上输入字符串的相关信息。我们将通过案例分析、数据研究等多种方式,帮助您更全面地了解这个主题,同时也将涉及一些关于ACE_Reactor实现运行时接收键盘输入、Appium 键盘输入、C++检测键盘输入、C无阻塞键盘输入的知识。
本文目录一览:read 键盘输入(cin.read()用于从键盘上输入字符串)
1、键盘输入
#!/bin/bash
echo "input a number"
#echo -n "Please input a number " 注:echo -n 为本行输入,没有参数则为换行输入
read ans
echo "Your input number is $ans"
exit 0 ;
2、键盘输入
#!/bin/bash
read -p "Enter a user :"
echo $REPLY
cd /var/log/
id=`cat maillog |grep $REPLY |awk ''{print $6}'' |uniq`
echo $id
for i in $id
do
cat /var/log/maillog |grep $i
done
exit 0 ;
3、时间限制 参数 -t
#!/bin/bash
if read -t 5 -p "please enter your name:" name
then
echo "hello $name, welcome to my script"
else
echo "sorry,too slow"
fi
exit 0
4、read 查询日志
#!/bin/bash
if read -t 10 -p "please enter the user in 10 seconds :" user
then
echo "The user is:$user , -------- "
{
id=`cat /var/log/maillog |grep $user |awk ''{print $6}'' |uniq`
if [ "$id" != "" ]
then
echo "We found the log ID: $id ,the detailed is as follows "
for i in $id
do
cat /var/log/maillog |grep $i
done
else
echo "The $user did not out send email,bye "
fi
}
else
echo "sorry,you are too slow ,bye !!!"
fi
exit 0
5、read 当输入的字符数目达到预定数目时,自动退出,并将输入的数据赋值给变量
#!/bin/bash
read -n1 -p "Do you want to continue [Y/N]? " answer
case $answer in
Y|y)
echo "good ,!!!!!";;
N|n)
echo "ok,go on";;
*)
echo "error choice";;
esac
exit 0
6、不显示 参数 -s ,read命令将文本颜色设置成与背景相同的颜色
#!/bin/bash
read -s -p "Enter your password: " pass
echo "your password is $pass"
exit 0
7、每行前添加序号 cat 命令的输出作为read命令的输入,读到的值放在line中
#!/bin/bash
count=1
cat dat| while read line
do
echo "$count: $line"
count=$(($count + 1))
done
exit 0
ACE_Reactor实现运行时接收键盘输入
说明:在ACE中,很多动态发生变化的行为都同伙消息事件来产生和处理。
小时事件例如:超时、信号发生等。
能够产生消息的类都要继承ACE_Event_Handler,这个类提供了一些虚方法供派生类重写。
比如:
handle_signal()方法用来处理信号类型的消息发生的时候应该做什么;
handle_timeout()方法主要用来捕获超时信号发生时应该做什么事。
捕获消息的任务是由ACE_Reactor类的run_reactor_enent_loop()方法来完成的。
处理消息的类要在对象初始化之前将消息类型注册到捕获消息的类中,这样捕获消息的类就知道捕获的消息由谁来处理了。用ACE_Reactor的register_handle()方法注册。
#include "ace/Reactor.h" #include "ace/Event_Handler.h" #include <iostream> #define SIGINT 2 //按下control + c (系统已有定义的信号量) class SignalHandler : public ACE_Event_Handler { public: //构造函数时注册信号,当此信号发生时(用户按下Ctrl+C时)被ACE_Reactor捕捉到 //同事调用此类的handle_signal方法 SignalHandler() { reactor()->instance()->register_handler(SIGINT,this); } int handle_signal(int signum,siginfo_t*,ucontext_t*) //处理信号 { switch(signum) { case SIGINT: std::cout<<"You pressed SIGINT(Ctrl+C)\n"; break; } return 0; } }; int ACE_TMAIN (int argc,ACE_TCHAR *argv[]) { SignalHandler* eh = new SignalHandler(); ACE_Reactor::instance ()->run_reactor_event_loop(); delete eh; return 0; }
Appium 键盘输入
模拟键盘输入也是非常重要的操作。这一小节来介绍那些关于键盘的操作。
pressKeyCode () 方法
appium 扩展提供了 pressKeyCode () 方法。该方法 Android 特有。
方法:
发送一个键码的操作。需要一个入参。
driver.pressKeyCode(66); // 回车键
下面提供 Android keycode 参考表:
电话键
KEYCODE_CALL 拨号键 5
KEYCODE_ENDCALL 挂机键 6
KEYCODE_HOME 按键 Home 3
KEYCODE_MENU 菜单键 82
KEYCODE_BACK 返回键 4
KEYCODE_SEARCH 搜索键 84
KEYCODE_CAMERA 拍照键 27
KEYCODE_FOCUS 拍照对焦键 80
KEYCODE_POWER 电源键 26
KEYCODE_NOTIFICATION 通知键 83
KEYCODE_MUTE 话筒静音键 91
KEYCODE_VOLUME_MUTE 扬声器静音键 164
KEYCODE_VOLUME_UP 音量增加键 24
KEYCODE_VOLUME_DOWN 音量减小键 25
控制键
KEYCODE_ENTER 回车键 66
KEYCODE_ESCAPE ESC 键 111
KEYCODE_DPAD_CENTER 导航键 确定键 23
KEYCODE_DPAD_UP 导航键 向上 19
KEYCODE_DPAD_DOWN 导航键 向下 20
KEYCODE_DPAD_LEFT 导航键 向左 21
KEYCODE_DPAD_RIGHT 导航键 向右 22
KEYCODE_MOVE_HOME 光标移动到开始键 122
KEYCODE_MOVE_END 光标移动到末尾键 123
KEYCODE_PAGE_UP 向上翻页键 92
KEYCODE_PAGE_DOWN 向下翻页键 93
KEYCODE_DEL 退格键 67
KEYCODE_FORWARD_DEL 删除键 112
KEYCODE_INSERT 插入键 124
KEYCODE_TAB Tab 键 61
KEYCODE_NUM_LOCK 小键盘锁 143
KEYCODE_CAPS_LOCK 大写锁定键 115
KEYCODE_BREAK Break/Pause 键 121
KEYCODE_SCROLL_LOCK 滚动锁定键 116
KEYCODE_ZOOM_IN 放大键 168
KEYCODE_ZOOM_OUT 缩小键 169
组合键
KEYCODE_ALT_LEFT Alt+Left
KEYCODE_ALT_RIGHT Alt+Right
KEYCODE_CTRL_LEFT Control+Left
KEYCODE_CTRL_RIGHT Control+Right
KEYCODE_SHIFT_LEFT Shift+Left
KEYCODE_SHIFT_RIGHT Shift+Right
基本
KEYCODE_0 按键’0’ 7
KEYCODE_1 按键’1’ 8
KEYCODE_2 按键’2’ 9
KEYCODE_3 按键’3’ 10
KEYCODE_4 按键’4’ 11
KEYCODE_5 按键’5’ 12
KEYCODE_6 按键’6’ 13
KEYCODE_7 按键’7’ 14
KEYCODE_8 按键’8’ 15
KEYCODE_9 按键’9’ 16
KEYCODE_A 按键’A’ 29
KEYCODE_B 按键’B’ 30
KEYCODE_C 按键’C’ 31
KEYCODE_D 按键’D’ 32
KEYCODE_E 按键’E’ 33
KEYCODE_F 按键’F’ 34
KEYCODE_G 按键’G’ 35
KEYCODE_H 按键’H’ 36
KEYCODE_I 按键’I’ 37
KEYCODE_J 按键’J’ 38
KEYCODE_K 按键’K’ 39
KEYCODE_L 按键’L’ 40
KEYCODE_M 按键’M’ 41
KEYCODE_N 按键’N’ 42
KEYCODE_O 按键’O’ 43
KEYCODE_P 按键’P’ 44
KEYCODE_Q 按键’Q’ 45
KEYCODE_R 按键’R’ 46
KEYCODE_S 按键’S’ 47
KEYCODE_T 按键’T’ 48
KEYCODE_U 按键’U’ 49
KEYCODE_V 按键’V’ 50
KEYCODE_W 按键’W’ 51
KEYCODE_X 按键’X’ 52
KEYCODE_Y 按键’Y’ 53
KEYCODE_Z 按键’Z’ 54
C++检测键盘输入
C/C++检测键盘输入,可以用kbhit()函数和或getch()函数。
kbhit()的用法
头文件包括“conio.h”。
程序执行到kbhit()时,等待输入,但是不会停止而是继续运行,有输入时kbhit()才就返回一个非零值,否则返回0。下面是一个例子。
#include <iostream>
#include "conio.h"
using std::cout;
int main()
{
int times = 5;
cout<<"Press any key:\n";
while(times)
{
if(!kbhit())
{
cout<<"No input now!\n";
}
times--;
}
return 0;
}
输出:
程序执行到 if(!kbhit()) 时,因为当前没有输入,所以会连续打印“Now input now!”五次结束。中间的时间根本来不及打断。
如果写个下面的例子,更加直观。
#include <iostream>
#include "conio.h"
using std::cout;
int main()
{
while(!kbhit())
{
cout<<"Now input now!\n";
}
return 0;
}
程序会不断地打印“Now input now!”,直到随便按下一个按键,程序跳出循环,执行结束。
getch()的用法
头文件包括“conio.h”。
程序执行到getch(),会保持等待状态,请求用户输入。按下一次按键后,读取一个字符,然后程序继续执行。这个字符可以赋值给其它变量。
举个例子:
#include <iostream>
#include "conio.h"
using std::cout;
int main()
{
int n;
char c;
cout<<"Press any key:\n";
getch();
cout<<"You pressed a key.\n";
cout<<"Press another key:\n";
c = getch();
cout<<"You pressed "<<c<<"\n";
cout<<"Press another key again:\n";
n = getch();
cout<<"You pressed "<<n<<"\n"; //ASCII
return 0;
}
三次输入,按下的都是“a”。最后输出:
结合以上特点,下面写个小游戏练习键盘输入检测。
练习
程序运行后,会显示一个密码盘,有0-9总共10个数字,并显示一个能由用户操控的光标(*),开始时居中,形式如下。
按下a键和d键控制光标分别向左和向右移动(称为key)。密码自由设定,有先后顺序。在下面的例程中,用户需要先向左转到1,再向右转到8,依次打开两道锁。每次打开锁后,会输出一行提示。
效果:
两道锁都打开后,按下任意按键退出。
代码中用了system(“cls”)来清屏,用了Sleep()来让系统等待特定的时间。(引用头文件“windows.h”)
#include <iostream>
#include "windows.h" //for system("cls") and Sleep()
#include "conio.h" //for getch()
#include <string> //for string
using std::cout;
using std::string;
//此处定义光标的图案和密码位置
const char key = ''*'';
const int pw1 = 2;
const int pw2 = 16;
//显示密码锁的界面
void show()
{
string numbers = "0 1 2 3 4 5 6 7 8 9\n";
string lines = "| | | | | | | | | |\n";
cout<<numbers;
cout<<lines;
}
//输出空格
void space(int i)
{
char space = ''\0'';
for(;i>0;i--)
{
cout<<space;
}
}
//核对密码
bool check_key_1(int k)
{
return k == pw1;
}
bool check_key_2(int k)
{
return k == pw2;
}
void move_key()
{
int place = 9; //空格数,定位用
char p; //用户的键盘输入
int counts = 0; //解锁次数统计
show(); //显示界面
space(place);
cout<<key; //定位并显示光标
p = getch(); //获取键盘输入
int flag = 1; //用于保持循环的标志
while(flag)
{
system("cls"); //清屏刷新
show();
if( p == ''a'')
{
place--; //光标左移一格
space(place);
cout<<key<<"\n";
}
else if( p == ''d'')
{
place++; //光标右移一格
space(place);
cout<<key<<"\n";
}
else
{
break; //按下的不是a和d就退出
};
switch(counts)
{
case 0:
{
if(check_key_1(place))
{
cout<<"First lock Unlocked!\n";
Sleep(1000); //等待一秒
counts ++;
}
else{}
break;
}
case 1:
{
if(check_key_2(place))
{
cout<<"Second lock Unlocked!\n";
Sleep(1000);
counts ++;
}
else{}
break;
}
default:
{
cout<<"All locks have been unlocked.\n";
cout<<"Press any key to continue...";
Sleep(1000);
flag = 0;
break;
}
}
p = getch(); //获取下一次键盘输入
}
}
int main()
{
move_key();
return 0;
}
C无阻塞键盘输入
我正在尝试用C语言编写一个程序(在Linux上),该程序将循环直到用户按下某个键为止,但不要求按下键盘来继续每个循环。
有没有简单的方法可以做到这一点?我认为我可以做到这一点,select()
但这似乎需要大量工作。
或者,有没有办法在程序关闭之前捕获ctrl
- c
按键进行清理,而不是非阻塞io?
答案1
小编典典如前所述,您可以使用sigaction
ctrl-c select
陷阱或任何标准输入。
但是请注意,使用后一种方法时,您还需要设置TTY,使其处于一次字符模式,而不是一次行模式。后者是默认设置-
如果您输入一行文本,则在您按Enter键之前,它不会发送到正在运行的程序的stdin中。
您需要使用该tcsetattr()
功能关闭ICANON模式,并且可能也禁用ECHO。从内存中,您还必须在程序退出时将终端设置回ICANON模式!
为了完整起见,这里有一些我刚刚删除的代码(nb:没有错误检查!),它设置了Unix TTY并模拟DOS<conio.h>
函数,kbhit()
并且getch()
:
#include <stdlib.h>#include <string.h>#include <unistd.h>#include <sys/select.h>#include <termios.h>struct termios orig_termios;void reset_terminal_mode(){ tcsetattr(0, TCSANOW, &orig_termios);}void set_conio_terminal_mode(){ struct termios new_termios; /* take two copies - one for now, one for later */ tcgetattr(0, &orig_termios); memcpy(&new_termios, &orig_termios, sizeof(new_termios)); /* register cleanup handler, and set the new terminal mode */ atexit(reset_terminal_mode); cfmakeraw(&new_termios); tcsetattr(0, TCSANOW, &new_termios);}int kbhit(){ struct timeval tv = { 0L, 0L }; fd_set fds; FD_ZERO(&fds); FD_SET(0, &fds); return select(1, &fds, NULL, NULL, &tv);}int getch(){ int r; unsigned char c; if ((r = read(0, &c, sizeof(c))) < 0) { return r; } else { return c; }}int main(int argc, char *argv[]){ set_conio_terminal_mode(); while (!kbhit()) { /* do some work */ } (void)getch(); /* consume the character */}
我们今天的关于read 键盘输入和cin.read()用于从键盘上输入字符串的分享就到这里,谢谢您的阅读,如果想了解更多关于ACE_Reactor实现运行时接收键盘输入、Appium 键盘输入、C++检测键盘输入、C无阻塞键盘输入的相关信息,可以在本站进行搜索。
本文标签: