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

C语言中使用read()读取STDIN的疑问及按缓冲区处理需求

问题解答

关于Enter键的疑问

Enter键并非发送信号,它只是向标准输入(STDIN)输入了一个换行符(ASCII码0x0A,即\n)。你遇到的read提前返回问题,根源是终端默认处于行缓冲模式:当用户按下Enter时,内核会立即将当前输入行的所有字符(包括换行符)提交给read,而非等待读满你指定的BUFF大小。只有将终端切换为无缓冲模式时,read才会等待凑够指定字节数再返回(除非遇到EOF或错误)。

实现按指定大小读取并输出的简洁代码

要实现每读取满BUFF个字符就写入标准输出(STDOUT),需要维护一个累计计数器,暂存每次read到的内容,凑够BUFF大小后再执行写入操作,同时处理EOF时剩余的不足BUFF的字符。代码如下:

#include <unistd.h>

#define BUFF 5  // 可根据需求修改为16

int main()
{
    char buf[BUFF];
    int total_read = 0;
    int just_read;

    // 循环读取,直到遇到EOF或错误
    while ((just_read = read(0, buf + total_read, BUFF - total_read)) > 0)
    {
        total_read += just_read;
        // 凑够BUFF字节数时写入STDOUT
        if (total_read == BUFF)
        {
            write(1, buf, BUFF);
            total_read = 0;  // 重置累计计数器
        }
    }

    // 处理EOF时剩余的未输出字符
    if (total_read > 0)
    {
        write(1, buf, total_read);
    }

    return 0;
}

代码逻辑说明

  • total_read用于累计已读取但未输出的字节数,每次read仅从缓冲区的buf + total_read位置写入,读取BUFF - total_read个字节,避免缓冲区溢出。
  • 当累计字节数等于BUFF时,调用write将整段内容输出,随后重置累计计数器。
  • 循环结束后,若还有剩余未输出的字符(比如输入未凑够BUFF就按下Ctrl+D触发EOF),将其一次性输出。

内容的提问来源于stack exchange,提问作者Timoti Fregni

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 01:35:20