2013-03-20 50 views
0

我试图在unistd.h中使用read函数实现getchar()函数。实现getchar与缓冲读取

我知道read(0,buffer,1)相当于getchar(),但是,它需要太多的系统调用。

有没有办法使用较少的系统调用来实现getchar()函数?

回答

0

是 - 读取一个更大的缓冲区(例如,至少几千字节)的全部数据。当用户调用getchar时,从缓冲区返回一个字符,除非它是空的。如果它是空的,请先填充缓冲区,然后返回一个字符。

+0

谢谢您的回复,杰里。但是,如果用户输入少于该缓冲区,该怎么办? – 2013-03-20 01:08:56

+0

@ user2188908:对于用户直接输入东西的交互式流,您通常需要使用行缓冲 - 即读到新行。鉴于交互式输入速度较慢,无论如何,在这种情况下,您通常并不关心速度。 – 2013-03-20 01:11:23

0

下面是一个简单的实施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; 
}