首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >getchar()是如何实现的?

getchar()是如何实现的?
EN

Stack Overflow用户
提问于 2012-03-03 06:44:56
回答 2查看 5.8K关注 0票数 4

我只是想知道getchar()是如何实现的?是像下面这样的吗?用这种方式读取是非常低的,单字节。它需要缓冲吗?

伪码:

代码语言:javascript
复制
int getchar() {

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

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

    return buf[0];
}
EN

回答 2

Stack Overflow用户

发布于 2015-10-09 01:10:44

下面是一个非常简单的实现。

代码语言:javascript
复制
int mygetchar(void)
{
        static char buf[BUFSIZ];
        static char *bufp = buf;
        static int i = 0;

        if (i == 0)
        {
                i = read(0, buf, 1);
                bufp = buf;
        }
        if ( --i >= 0 )
        {
                return  *bufp++;
        }

        return EOF;
}
票数 3
EN

Stack Overflow用户

发布于 2012-03-03 08:47:51

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

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

我知道至少有一种情况(滑翔),即可以选择--通过fopen()的一个额外选项--通过内存映射(即mmap())访问文件,而不是read()/write()。为了避免在调用更高级别的函数(如scanf() )时出现问题,getchar()被迫使用相同的缓冲结构。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9544151

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档