带有 ~ENABLE_LINE_INPUT 的控制台不通过 /r
Console with ~ENABLE_LINE_INPUT doesn't pass /r
我正在设置一个 windows 控制台,通过取消设置 ENABLE_LINE_INPUT 来传递每个字符的输入(与每一行相反)。
一个非常奇怪的副产品是我只在额外击键后才得到 cartage-return ('\r') 字符。
这是初始化代码:
DWORD consoleModeIn;
HANDLE hStdin = GetStdHandle(STD_INPUT_HANDLE);
GetConsoleMode(hStdin, &consoleModeIn);
consoleModeIn = consoleModeIn & ~(ENABLE_ECHO_INPUT | ENABLE_LINE_INPUT);
SetConsoleMode(hStdin, consoleModeIn);
正在阅读:
size_t read_from_stdio(uint8_t* buf, size_t len)
{
size_t ret;
while ((0 == (ret = _read(_fileno(stdin), buf, len))) && (errno==EAGAIN));
return ret;
}
取消设置 ENABLE_PROCESSED_INPUT 也不会。
感谢任何帮助。
您正在使用默认文本模式(对于 tty)从 STDIN
文件描述符中读取。在文本模式下,C 运行时期望将换行符读取为 CRLF,并将其转换为 LF 以促进跨平台程序。要实现这一点,它需要读取 CR 之后的下一个字符以查找 CRLF 序列。通常,在启用行输入和处理输入模式的情况下从控制台读取时这不是问题,因为控制台会在其输入缓冲区中将 CR 转换为 CRLF。但是,通过禁用行输入模式,您还禁用了使控制台将 CR 转换为 CRLF 的处理输入模式部分。
要解决此问题,您可以通过 _setmode(_fileno(stdin), _O_BINARY)
在启动时设置二进制模式。但是,使用二进制模式 stdio,您将被限制为控制台的当前输入代码页,在最新的 Windows 10 中代码页 65001 (UTF-8) 仍然是错误的,因此无法读取 Unicode。要获得 Unicode 支持而不求助于直接调用 Windows 控制台 API(例如 ReadConsoleW
),您可以改用 conio _getwch
.
我正在设置一个 windows 控制台,通过取消设置 ENABLE_LINE_INPUT 来传递每个字符的输入(与每一行相反)。 一个非常奇怪的副产品是我只在额外击键后才得到 cartage-return ('\r') 字符。
这是初始化代码:
DWORD consoleModeIn;
HANDLE hStdin = GetStdHandle(STD_INPUT_HANDLE);
GetConsoleMode(hStdin, &consoleModeIn);
consoleModeIn = consoleModeIn & ~(ENABLE_ECHO_INPUT | ENABLE_LINE_INPUT);
SetConsoleMode(hStdin, consoleModeIn);
正在阅读:
size_t read_from_stdio(uint8_t* buf, size_t len)
{
size_t ret;
while ((0 == (ret = _read(_fileno(stdin), buf, len))) && (errno==EAGAIN));
return ret;
}
取消设置 ENABLE_PROCESSED_INPUT 也不会。
感谢任何帮助。
您正在使用默认文本模式(对于 tty)从 STDIN
文件描述符中读取。在文本模式下,C 运行时期望将换行符读取为 CRLF,并将其转换为 LF 以促进跨平台程序。要实现这一点,它需要读取 CR 之后的下一个字符以查找 CRLF 序列。通常,在启用行输入和处理输入模式的情况下从控制台读取时这不是问题,因为控制台会在其输入缓冲区中将 CR 转换为 CRLF。但是,通过禁用行输入模式,您还禁用了使控制台将 CR 转换为 CRLF 的处理输入模式部分。
要解决此问题,您可以通过 _setmode(_fileno(stdin), _O_BINARY)
在启动时设置二进制模式。但是,使用二进制模式 stdio,您将被限制为控制台的当前输入代码页,在最新的 Windows 10 中代码页 65001 (UTF-8) 仍然是错误的,因此无法读取 Unicode。要获得 Unicode 支持而不求助于直接调用 Windows 控制台 API(例如 ReadConsoleW
),您可以改用 conio _getwch
.