Io 从Erlang读取字符输入,无需在提示符下按回车键

Io 从Erlang读取字符输入,无需在提示符下按回车键,io,erlang,stdin,Io,Erlang,Stdin,我正在查看io模块 并且发现读取输入使用提示并等待用户按Enter键(返回?) 如何在不需要按enter键的情况下一次读取1个字符 编辑 我试过了 io:setopts([{binary,true}])但这并不能改变它。把自己绑在量子土豆上,你即将进入一个你从未知道存在的痛苦世界 一个负责任的程序员会告诉你,没有办法做到这一点,当然不是便携式的 现在,“不可携带”一词已经被诸如CHAR\u BIT!=8巧妙地说服所有人“不可移植”意味着“某些60年代后期构建的添加LSD的系统无法运行此功能”或

我正在查看
io
模块

并且发现读取输入使用提示并等待用户按Enter键(返回?)

如何在不需要按enter键的情况下一次读取1个字符

编辑

我试过了


io:setopts([{binary,true}])
但这并不能改变它。

把自己绑在量子土豆上,你即将进入一个你从未知道存在的痛苦世界


一个负责任的程序员会告诉你,没有办法做到这一点,当然不是便携式的

现在,“不可携带”一词已经被诸如
CHAR\u BIT!=8
巧妙地说服所有人“不可移植”意味着“某些60年代后期构建的添加LSD的系统无法运行此功能”或“无法在Windows上运行”

不,你将要遇到的是一种便携性问题,导致我们的祖先自愿使用自动工具。真的,真的,不能跨不同的,甚至是POSIX“兼容”的系统进行移植

正如您可能想象的那样,实现这一点的明智方法是依赖于类似Ncurses的东西,但正如许多生活必需品一样,Erlang不存在非NIF实现

尽管我刚才给了你们所有这些警告,但我在过去的紧要关头还是做了以下几点:

-module(thing).
-compile(export_all).

get_char() ->
    Ch = io:get_chars("p: ", 1),
    io:fwrite("Ch: ~w", [Ch]).

start() ->
    io:setopts([{binary, true}]),
    get_char().
当然,单靠这一点是行不通的。因此,您需要从另一个设置了相应termios输入标志的脚本调用脚本。正如我前面提到的,这在过去是一场真正的恶作剧,我没有听到任何让我相信情况已经改变的消息

#!/bin/sh
stty --f /dev/tty icanon raw
erl -pa ./ -run thing start -run init stop -noshell
stty echo echok icanon -raw
也可以在Erlang程序中调用“stty”或发送魔法符,但如果内存可用,则需要使用
-noshell调用
erl
,并添加额外的
stty
咒语,如
time
echo 0

我过去遇到的另一个问题是,虽然您可以安全地使用
get_chars
,但其他
io
函数将失败,因为其中一些函数有自己的内置“在线烹饪”

如果所有这些还没有让你相信计算机是人类的灾难,你可以在这本优秀的书中读到更多关于这方面的细节


祝你好运。

可能重复感谢@SteveVinoski,很接近,但这个问题是在长生不老药中,他们接受的答案也是如此。给出的erlang诅咒答案在自述文件中没有明确指出如何逐行接受输入,而是显示了一个跳跃的“Hello World”,因此我相信这不是重复的,不应该关闭。这确实有效,谢谢。作为一种解决方法,我编写了一个c程序,可以设置调用erlang文件的
sttyraw
(ERLShell不能)。从另一个erlang进程加载数据时遇到tcp套接字一致性问题,顺便说一句,如果你敢看,你的答案可以,但使用stop需要很长时间才能关闭。使用
halt
而不是
stop
向用户显示错误消息,我想知道是否有解决方案?我的目标是在erlang环境中逐字符读取。。我认为我的另一个问题是正确的,通过运行单独的erlang服务器和Ping itAha。我只是从调用中删除了stop,使get_char()循环,这非常有效!相关--如何在不显示崩溃转储的情况下退出