[英]why doesn't read() work after scanf()?
好的,这是一个愚蠢的问题,我相信我“应该”知道这一点,但我不知道......
FILE
结构包装文件描述符,所以如果我fscanf
那应该推进文件描述符。
但是对于这个编译为foobar
程序:
#include <stdio.h>
#include <unistd.h>
int main() {
char c;
scanf("%c", &c);
printf("scanned %c\n", c);
read(STDIN_FILENO, &c, 1);
printf("read %c\n", c);
read(STDIN_FILENO, &c, 1);
printf("read %c\n", c);
}
>echo bcd | ./foobar
scanned b
read b
read b
出现文件描述符没有前进,因为第一次read
读取b
。 更令人惊讶的是,第二个也读取b
(即使我省略了scanf
,然后首先read
读取b
和第二个读取, c
)。
我相信这是显而易见的,我真的很尴尬地问为什么。 我从来也没有遵循scanf
与read
之前。
我知道scanf
总体上是一个坏主意,但在我的情况下它是可以的,因为我控制管道的另一端,这对我来说很方便。
stdin
流本身将执行read
以填充整个缓冲区,这可能是数千个字符宽。 这对您的read
系统调用没有任何影响。 scanf
只是从该缓冲区中提取字符。
您的后续read
系统调用实际上返回0(由于文件结束而没有读取字节)并且没有将任何数据放入c
,因此保留其值'b'
。 您的程序没有注意到这种情况,因为它没有检查返回值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.