c语言 - 我不明白为什么这段代码似乎是缓冲的,而我使用的是未缓冲的I / O



在这个简单的代码中,我注意到您没有从第二次读取调用中读取 stdin,为什么会发生这种情况?由于这些函数没有缓冲。

#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]

然后有两个字符在标准定值上挂起:"a"和""(换行符(

因此,第一次调用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);

然后它应该按预期工作。

相关内容