繁体   English   中英

为什么scan()之后没有read()工作?

[英]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 )。

我相信这是显而易见的,我真的很尴尬地问为什么。 我从来也没有遵循scanfread之前。

我知道scanf总体上是一个坏主意,但在我的情况下它是可以的,因为我控制管道的另一端,这对我来说很方便。

stdin流本身将执行read以填充整个缓冲区,这可能是数千个字符宽。 这对您的read系统调用没有任何影响。 scanf只是从该缓冲区中提取字符。

您的后续read系统调用实际上返回0(由于文件结束而没有读取字节)并且没有将任何数据放入c ,因此保留其值'b' 您的程序没有注意到这种情况,因为它没有检查返回值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM