我想一次从PHP的命令行中一次读取一个字符,但是似乎从某处阻止了某种输入缓冲。
考虑以下代码:
#!/usr/bin/php
<?php
echo "input# ";
while ($c = fread(STDIN, 1)) {
echo "Read from STDIN: " . $c . "\ninput# ";
}
?>
输入“ foo”作为输入(并按回车键),我得到的输出是:
input# foo
Read from STDIN: f
input# Read from STDIN: o
input# Read from STDIN: o
input# Read from STDIN:
input#
我 期望 的输出是:
input# f
input# Read from STDIN: f
input# o
input# Read from STDIN: o
input# o
input# Read from STDIN: o
input#
input# Read from STDIN:
input#
(即,在键入字符时对其进行读取和处理)。
但是,当前,仅在按下回车键后才能读取每个字符。我怀疑TTY正在缓冲输入。
最终,我希望能够读取按键,例如向上箭头,向下箭头等。
我的解决方案是-icanon
在TTY上设置模式(使用stty
)。例如。:
stty -icanon
因此,现在可以使用的代码是:
#!/usr/bin/php
<?php
system("stty -icanon");
echo "input# ";
while ($c = fread(STDIN, 1)) {
echo "Read from STDIN: " . $c . "\ninput# ";
}
?>
输出:
input# fRead from STDIN: f
input# oRead from STDIN: o
input# oRead from STDIN: o
input#
Read from STDIN:
input#
完成操作后,别忘了还原TTY …
恢复tty配置
通过在更改终端状态之前保存tty状态,可以将终端重置回原来的状态。完成后,您可以恢复到该状态。
例如:
<?php
// Save existing tty configuration
$term = `stty -g`;
// Make lots of drastic changes to the tty
system("stty raw opost -ocrnl onlcr -onocr -onlret icrnl -inlcr -echo isig intr undef");
// Reset the tty back to the original configuration
system("stty '" . $term . "'");
?>
这是保存tty并将其放回用户开始之前的方式的唯一方法。
请注意,如果您不担心保留原始状态,只需执行以下操作即可将其重置回默认的“健全”配置:
<?php
// Make lots of drastic changes to the tty
system("stty raw opost -ocrnl onlcr -onocr -onlret icrnl -inlcr -echo isig intr undef");
// Reset the tty back to sane defaults
system("stty sane");
?>
问题内容: 我要我的应用程序显示: 当我按 任意 键时,它就会退出。 我该如何实现? 注意:我已经用Google搜索过,但是找到的所有内容都需要在最后按 Enter 键。我想要类似C#的东西。 我正在运行MS Windows。 问题答案: termbox-go是一种轻巧的Go- native软件包,提供一些基本的终端控制。包括以原始模式获取输入的能力(一次读取一个字符,而没有默认的行缓冲行为)。
问题内容: 我正在将一个控制台应用程序转换为使用Swing的应用程序。目前,我希望我的程序执行与此类似的操作,如何通过使用或类似方法实现此目标? 简而言之; 在用户在文本字段中输入内容并按Enter之前,如何保持程序的执行。 问题答案: 更新: 因此,您要等待用户从GUI输入内容。这是可能的,但由于GUI在另一个线程中运行,因此需要进行 同步 。 因此,步骤如下: 创建一个“ holder”对象,
我的问题是- 给定两个长度相等的字符串s1和s2作为输入,预期的输出是一个字符串,其中s1的第一个字符,s2的第一个字符,s1的第二个字符,s2的第二个字符,依此类推。例如,如果s1=“外部”,s2=“空间”,则输出为“OSuptaecre”。 我已经用循环完成了,我想知道这个程序是否还有其他简单的代码,比如使用字符串函数。
在下面的例子中,我试图接受用户的单字符输入,但是当运行程序时,我得到do...而循环执行多次。请参阅下面程序的结果。 如果有人能帮我找到答案,如何解决这个问题?
问题内容: 当用户在Java中键入单个字符时,是否有一种简单的方法可从控制台读取它?可能吗?我尝试了这些方法,但是它们都在等待用户按Enter键: 我开始认为System.in在按下Enter之前不知道用户输入。 问题答案: 您要做的是将控制台置于“原始”模式(绕过行编辑且无需输入键),而不是“经烹煮”模式(需要输入键进行行编辑)。在UNIX系统上,“ stty”命令可以更改模式。 现在,关于Ja
本文向大家介绍解决C语言输入单个字符屏蔽回车符的问题,包括了解决C语言输入单个字符屏蔽回车符的问题的使用技巧和注意事项,需要的朋友参考一下 C语言的scanf()函数在接收输入单个字符时会把上一次输入的回车符号当做这次输入的字符,造成无法正确的输入字符数据。这恐怕是初学C的童鞋门遇到的最头疼的问题了。 今天给大家提供四种解决方法供借鉴。 1、在scanf()中使用'\n'屏蔽回车符号。 scanf