C++ std::getline和控件字符

C++ std::getline和控件字符,c++,iostream,C++,Iostream,如果我这样做: std::string buffer; std::getline(std::cin, buffer); 尽管libreadline提供了许多细节,但我仍然能够使用backspace和ENTER来输入字符串。我不确定谁的责任是处理这些控制字符。它是输入流std::cin,是底层控制台设备,还是std::getline本身 我不确定谁的责任是处理这些控制字符。它是输入流std::cin、底层控制台设备还是std::getline本身 这是控制台/终端/你拥有的东西。相反,如果您通

如果我这样做:

std::string buffer;

std::getline(std::cin, buffer);
尽管libreadline提供了许多细节,但我仍然能够使用backspace和ENTER来输入字符串。我不确定谁的责任是处理这些控制字符。它是输入流
std::cin
,是底层控制台设备,还是
std::getline
本身

我不确定谁的责任是处理这些控制字符。它是输入流std::cin、底层控制台设备还是std::getline本身

这是控制台/终端/你拥有的东西。相反,如果您通过管道向流程提供字符串,则应接收,例如
\b
(退格)

我不确定谁的责任是处理这些控制字符。它是输入流std::cin、底层控制台设备还是std::getline本身

这是控制台/终端/你拥有的东西。相反,如果您通过管道向流程提供字符串,则应该接收,例如
\b
(退格)。

它是终端设备(控制台)

典型的终端将提供:

  • 缓冲(程序接收整行)
  • 简单的行编辑(至少退格和回车,可能的行调用和光标键编辑)
  • 回音(你可以看到你键入的内容)
提供的确切功能取决于操作系统和为终端设置的功能。如果重定向标准输入,所有这些功能通常会消失,控制字符会直接通过。

这是终端设备(控制台)

典型的终端将提供:

  • 缓冲(程序接收整行)
  • 简单的行编辑(至少退格和回车,可能的行调用和光标键编辑)
  • 回音(你可以看到你键入的内容)

提供的确切功能取决于操作系统和为终端设置的功能。如果重定向标准输入,所有这些功能通常都会消失,控制字符会直接传递。

如果您试图控制控制台的键盘功能与流内容,
std::getline
,就这一点而言,std IO流一般不会让您达到目的。您需要一个依赖于平台的解决方案来实现这一点。控制台设备最终是必须控制的,以防止/允许这种低级硬件交互。@WhozCraig我不是真的想做任何事情,只是想知道处理退格键的是谁,因为我没有从
std::getline()
,即。(我不需要通过
缓冲区
自己处理BS控制字符)。好的,这相当清楚地说明了你的问题(我想)。顺便说一句,这也让问题变得更有趣。很难描述,所以需要一些道具。如果您试图控制控制台的键盘功能,而不是流内容,
std::getline
,就这一点而言,一般来说,std IO streams不会让您达到目的。您需要一个依赖于平台的解决方案来实现这一点。控制台设备最终是必须控制的,以防止/允许这种低级硬件交互。@WhozCraig我不是真的想做任何事情,只是想知道处理退格键的是谁,因为我没有从
std::getline()
,即。(我不需要通过
缓冲区
自己处理BS控制字符)。好的,这相当清楚地说明了你的问题(我想)。顺便说一句,这也让问题变得更有趣。很难描述,所以这是一个尝试的道具。所以这是一个从控制台设备读取的阻塞,一旦按下ENTER键就会返回?当然,除非设备被重定向。或多或少。它不是一个物理设备/驱动程序,而是一个中间软件实体,如一个术语我认为e有点依赖于操作系统。如果你想通过控制台获取无缓冲输入,你需要使用一个与终端接口的库,比如。同样有趣的是,WRT*nix世界:所以它是从控制台设备进行的阻塞读取,按下ENTER键后返回?当然,除非设备被重定向。或多或少。它不是对于物理设备/驱动程序,它是一个中间软件实体,如a--我认为这里的术语有点依赖于操作系统。如果你想通过控制台获取无缓冲输入,你需要使用一个与终端接口的库,例如。同样有趣的是*nix世界: