c - 我不明白为什么这段代码似乎在缓冲,而我正在使用无缓冲的 I/O
问题描述
在这个简单的代码中,我注意到您没有从第二次读取调用中读取标准输入,为什么会发生这种情况?由于这些函数没有缓冲。
#include <stdio.h>
#include <unistd.h>
int main(void) {
char a, b;
write(1, "first: ", 8);
read(0, &a, 1);
write(1, "second: ", 10);
read(0, &b, 1);
putchar(a);
putchar(b);
return 0;
}
解决方案
如果您启动程序并键入(例如)
a [enter]
然后两个字符在 stdin 上挂起:'a' 和 '\n'(换行符)
所以第一次调用read()
块,等待输入 - 在你输入字符后 - 读取a
.
第二次调用read()
不会阻塞,而是立即读取第二个待处理字符(换行符\n
)。
要解决此问题,您必须将换行符读入一些虚拟缓冲区,可能像这样:
char a, b, dummy;
write(1, "first: ", 8);
read(0, &a, 1);
read(0, &dummy, 1);
write(1, "second: ", 10);
read(0, &b, 1);
read(0, &dummy, 1);
putchar(a);
putchar(b);
然后它应该按预期工作。
推荐阅读
- python - 导入数据 django-import-export 不在 celery 任务中创建对象
- python - 尝试通过在 powershell 中执行代码的 python 脚本运行 print('hello world') 时发现错误
- javascript - 将 jQuery 变量传递给 javascript
- java - 如何使用弹簧调度程序而不是骆驼计时器启动骆驼路线
- android - 从微调器表单适配器获取值到另一个活动,并从该值生成计数器
- r - 从 github 存储库下载 rds 文件
- google-analytics - 在 BigQuery 中但在 Google Analytics 中没有包含小时-分钟组合的综合浏览量条目的原因是什么?
- django - Save() 方法线程安全与否在 Django 中
- firebase - 测试在带有 Firebase 插件的 Flutter Web 应用程序中不起作用
- php - 将值绑定到 WHERE IN(sql)