gpt4 book ai didi

c++ - 我怎样才能刷新标准输入? (环境 : Mingw compiler, 运行在 xterm 或 Cygwin 的 mintty 中)

转载 作者:可可西里 更新时间:2023-11-01 11:50:02 27 4
gpt4 key购买 nike

我知道有两种刷新标准输入的方法:

(1) bool FlushConsoleInputBuffer(_In_ HANDLE hConsoleInput); (2) fflush (stdin);

但是,在我的环境中:

Compiler: MinGW  g++
Running in: Windows, Cygwin xterm or Cygwin mintty

它们都不起作用。

我能做什么?

注意:如果我的程序在 dos 提示窗口下运行,FlushConsoleInputBuffer() 会起作用。此外,FlushConsoleInputBuffer() 在 Cygwin xterm 或 mintty 上运行时会很好地返回 false。

--更新--

我怀疑 Cygwin 与 Windows 原生标准输入分开处理标准输入,这使得 FlushConsoleInputBuffer() 失败。

@wallyk:是的。 'flush' 意味着丢弃所有未读的缓冲输入。

--UPDATE--(接受最终答案和原因)

Tony D 是对的。问题是 Cygwin 终端是一个类 unix 终端,它允许在按下“ENTER”键之前进行编辑。因此,任何部分输入都必须被缓冲,并且在按下“ENTER”键之前永远不会传递给标准输入,因为它需要编辑命令。我想应该可以通过将终端设置为原始模式(未试验)来克服这个问题。然而,编辑功能将在原始模式下丢失。

最佳答案

fflush 旨在与输出流一起使用。 fflush(stdin) 的行为未定义。参见 http://en.cppreference.com/w/cpp/io/c/fflush .

如果你使用std::cin访问stdin,你可以使用std::istream::ignore()忽略流的内容,最多给定字符数或给定字符。

例子:

// Ignore the rest of the line.
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');

工作代码:http://ideone.com/Z6zLue

如果您使用 stdin 访问输入流,您可以使用以下代码忽略该行的其余部分。

while ( (c = fgetc(stdin)) != '\n' && c != EOF);

工作代码:http://ideone.com/gg0Az2

关于c++ - 我怎样才能刷新标准输入? (环境 : Mingw compiler, 运行在 xterm 或 Cygwin 的 mintty 中),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32174083/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com