You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 17:18:01