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
相关产品推荐
相关产品推荐

