如何实现getchar()?

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

Pseudo code: int getchar(){ char buf[1]; int n = read(0,buf,1); if(n < 1) printf("Read failed"); return buf[0]; } 

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

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

我知道至少有一种情况( glibc ),其中文件可以选择 – 通过fopen()的额外选项 – 通过内存映射(即mmap() )而不是read() / write() 。 为了避免在调用更高级函数(例如scanf()getchar()强制使用相同的缓冲结构。

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

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

 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; }