ReadConsole()与fgets()有何区别?二者都可从stdin读取字符吗?
ReadConsole() 与 fgets() 具体差异
以下是针对Visual Studio 2019 Windows开发环境的差异说明:
- 所属标准与平台兼容性
fgets()属于C标准库<stdio.h>定义的通用函数,全平台(Windows/Linux/macOS)通用,跨平台编译无需修改代码。ReadConsole()是Win32原生API,仅支持Windows平台,无法在非Windows系统编译运行,使用时需引入<windows.h>头文件。 - 输入源支持范围
fgets()支持从任意标准I/O流读取内容,包括控制台标准输入stdin、普通文件流、管道流等,输入源被重定向时也可正常工作。ReadConsole()仅能读取控制台输入缓冲区的内容,当stdin被重定向到文件/其他非控制台资源时,调用会直接失败。 - 字符编码支持
fgets()默认遵循C运行时的全局编码设置,默认使用ANSI编码读取内容,如需读取宽字符需调用宽字符版本fgetws(),且需要提前手动配置区域设置避免乱码。ReadConsole()原生提供两个版本:ReadConsoleA()(ANSI编码)、ReadConsoleW()(Unicode宽字符编码),无需修改C运行时配置即可直接读取全语言Unicode输入,适合Windows平台国际化控制台程序使用。 - 功能灵活度
fgets()功能固定,仅支持按行读取内容,遇到换行符或EOF就停止读取,仅能返回输入的字符内容,无法识别控制台特殊输入(功能键、鼠标事件等)。ReadConsole()支持自定义读取的字符数量(不需要按行读取),可配置是否回显输入(适合密码输入场景),还支持捕获控制台特殊按键、鼠标操作等事件,可实现更复杂的控制台交互逻辑。 - VS2019下使用建议
如果你开发的程序需要跨平台运行,优先选择fgets(),该函数不会触发VS的安全编译警告,无需替换为_s后缀的安全版本。
如果你仅开发Windows专属程序,需要实现复杂控制台交互、无乱码Unicode输入,可选择ReadConsole(),调用前需要先通过GetStdHandle(STD_INPUT_HANDLE)获取控制台输入句柄。
简单使用示例对比:
fgets()读取控制台输入:char buf[1024]; fgets(buf, sizeof(buf), stdin);
ReadConsoleW()读取控制台输入:#include <windows.h> WCHAR wbuf[1024]; DWORD readCnt; HANDLE hInput = GetStdHandle(STD_INPUT_HANDLE); ReadConsoleW(hInput, wbuf, _countof(wbuf)-1, &readCnt, NULL); wbuf[readCnt] = L'\0';
内容的提问来源于stack exchange,提问作者Song Zihuan
相关产品推荐
相关产品推荐

