【问题标题】:How to make command history in console application?如何在控制台应用程序中创建命令历史记录?
【发布时间】:2013-09-01 14:12:18
【问题描述】:

我想制作交互式控制台应用程序,它允许循环输入命令。例如,用户键入“搜索”,程序会找到一些数据并将其打印在屏幕上。然后程序等待下一个命令(可以是搜索、退出或其他)。为了用户的方便,我希望我的程序支持命令历史记录(比如在终端中,当按下键盘上的向上和向下箭头时)。但我不知道该怎么做,因为我不知道如何打印可以被 scanf、std::getline、std::cin 等进一步阅读的文本。 所以代码std::cin << "hello"; 没有被编译('std::cin fprintf(stdin, "hello"); 不打印任何内容,scanf 无法读取此打印消息。显然std::getline(std::cin, str);scanf("%s", s);gets(s)等无法读取printfstd::out输出的文本。所以问题是:如何在控制台上打印文本,这些文本也将在stdin (std::cin) 中?或者也许有更优雅的方式来组织命令历史?

附:我也想过模拟按下按钮来打印我需要的文本,但我希望有更好的方法来制作命令历史

附言我使用 Linux 和 C++

【问题讨论】:

  • 当您记得标准 I/O 在没有屏幕但有打印机的 systemw 上启动时,它会有所帮助。 printf 字面印刷文字。要使用scanf 将其读回,需要人工操作员将实际的纸张输出馈送到扫描仪。

标签: c++ linux console terminal


【解决方案1】:

使用专门为此目的制作的readline and history libraries

【讨论】:

  • 请注意,这些 GNU 版本要求所有链接到它们的代码都必须在 GPL 下获得许可。
【解决方案2】:

如果您不想使用 Kerrek SB 建议的库,您可能会考虑另一个方向:

1) 历史记录中应该包含哪些命令? -> 所有命令,用户键入。 2) 你怎么知道用户输入了什么? -> 你从 std::in 得到它 3) 你如何处理从 std::in 获得的命令? -> 你处理它们(例如,当用户输入“搜索”时开始搜索)

除了第 3 步之外,您还可以只存储用户在内部键入的命令(例如,在某种向量中)。如果现在您的用户想要使用命令历史并按下“向上键”(或“向下键”),您只需在内部向量中查找相应的命令。之后他按“输入”?只需处理命令,用户从您的内部命令历史中选择。

【讨论】:

  • 我想过,但用户可能想在按“回车”之前更改命令。例如,他在命令中犯了一个错误,想要更正它并启动一个固定的命令。因此,我不能只跟踪“向上键”和“输入”按钮。
猜你喜欢
  • 1970-01-01
  • 2011-10-21
  • 1970-01-01
  • 2015-05-11
  • 2016-01-13
  • 2017-02-23
  • 2012-11-30
  • 2015-09-02
  • 2021-04-16
相关资源
最近更新 更多