从控制台读取数据

Posted

技术标签:

【中文标题】从控制台读取数据【英文标题】:Reading data from the console 【发布时间】:2013-07-29 01:31:40 【问题描述】:

我编写了一个控制台应用程序,它在运行时有自己的命令提示符。不幸的是,我不能简单地调用 std::cin 并等待输入,因为我需要解释 up/down 以获取命令历史记录。

相反,我不得不关闭回显并将控制台置于非规范模式,并使用“读取”命令逐个获取每个字符,如果它们是可打印字符则回显它们,或者尝试解析/解释它们如果它是转义码的开始。

我遇到的问题是很难以通用/通用方式阅读和解析各种转义代码。当我必须读取/解析对尺寸/位置查询的响应时,问题就更加严重了。

有没有更好的从终端读取的方法?是否有可以读取/解析特殊终端代码的特殊功能? ncurses 不是一个可行的选择(它会清除屏幕,甚至只使用 filter() 似乎有点过分),而其他应用程序一直这样做,而不必引入这些依赖项......我做错了什么?

这是我当前的“获取”功能的片段,它的读取功能非常有限(并且使用更高级的代码,已损坏)。

int getch_ex()

    int buf = 0;
    size_t count = read(0, &buf, 1);
    if ((count > 0) && (buf == ESCAPE_CODE))
    
        size_t count = read(0, &buf, 1); // [
        if ((count > 0) && (buf == '['))
        
            count = read(0, &buf, 2);
        
    
    return (buf);

其他带有提示的终端应用程序(grub、python 等)如何实现这一点?

我的主要目标是 Linux 和 OS X。

【问题讨论】:

【参考方案1】:

看看readline 库。听起来这正是您想要的。请注意 license 如果此商业代码虽然。

【讨论】:

它是一个开源解决方案,可用于商业应用,因此许可证必须灵活。不过我会调查的。 虽然 readline 似乎是一个可行的解决方案(代码方面),但不幸的是,它在 GPL(而不是 LGPL)下可能不是可接受的许可。不过,我的应用程序分为两个组件。一个包含所有真实代码的库,以及调用该库的 shell 的可执行文件。如果我在 shell 中使用 readline(而不是在库中),是否只需要对 shell 进行 GPL 编译?如何在法律上将两者分开? 我不是律师,所以我不会对此发表意见。有一个类似于 readline 的包具有更宽松的许可证,但我不记得名字了。您可能想四处询问。 readline 的***页面列出了一些,但它们要么将 ncurses 作为依赖项引入,要么它们不像我想要的那样可移植。因为我找不到适合我需求的可行解决方案,所以我最终解决了读取/解析比我已经做的更多代码的需求。我真的很想使用 readline,因为它看起来是一种更清洁、更好的方法,我接受它作为一种解决方案(对其他人而言),但它的许可证限制性太强。不过还是谢谢你的建议。【参考方案2】:

如果您不使用 GUI 或 Windowing 系统,请查看 ncurses 库包。

【讨论】:

ncurses 要求您清除屏幕,因此这不是一个可行的解决方案。我认为您可以在不初始化屏幕的情况下使用 filter() 来使用某些 ncurses 函数,但是对于如此小的需求(以及我检查的所有其他应用程序都实现了同样的任务,无需拉入就可以做到这一点)其他依赖项)

以上是关于从控制台读取数据的主要内容,如果未能解决你的问题,请参考以下文章

java中怎样读取控制台输入的整形数据

使用 C# 从 AWS 上的 S3 读取 Avro 数据

从 Firebase 读取数据并保存到数组中 (Swift)

如何从当前在控制台中的 python 读取一行?

Nodejs 从 http 请求块中读取 JSON 数据

Python从文件中读取数据