如何实现getchar()?

时间:2012-03-03 06:44:57

标签: c stdio

我只是想知道getchar()是如何实现的?它是否像以下那样?以这种方式读取单字节是非常低效的。它是否使用缓冲?

伪码:

int getchar() {

    char buf[1];
    int n = read(0, buf, 1);

    if(n < 1)
        printf("Read failed");

    return buf[0];
}

2 个答案:

答案 0 :(得分:2)

考虑到标准C库的实现数量,不可能提供明确的答案,但最常见的答案似乎遵循相同的一般准则。

根据定义,getchar()使用标准C库的流基础结构,即FILE及其友好功能。在大多数现代C库实现中,文件流缓冲到一定程度,缓冲区大小和行为通常可通过setvbuf()进行调整。

我知道至少有一种情况(glibc),其中文件可以选择 - 通过fopen()的额外选项 - 通过内存映射(即mmap())而不是{ {1}} / read()。为避免与调用更高级别函数(例如write())混合时出现问题,scanf() 强制使用相同的缓冲结构。

如果没有来自分析器的信息,我会更担心使用getchar()的任何代码的结构复杂性,而不是使用它导致的任何性能问题。

答案 1 :(得分:1)

这是一个非常简单的实现。

variableValue