用read实现getchar

时间:2013-03-20 02:12:02

标签: c

我试图在unistd.h中使用read()来实现getchar()函数。

由于系统调用是pricy,我想尽可能少地执行read()函数。

如果我使用“getchar”,它可以正常工作。但是,“mygetchar”在这种情况下不起作用。

有人能指出我下面做错了什么吗?

#include <stdio.h>
#include <unistd.h>

#define BUF_SIZE 1024

int startIndex;
int endIndex;

int mygetchar(void){
  char buffer[BUF_SIZE];
  startIndex=0;
  endIndex=0;
  if(startIndex == endIndex){
    int r;
    r = read(0,buffer,BUF_SIZE);
    startIndex=0;
    endIndex=r;
  }
  return buffer[startIndex++];
}


int main(){
  char c;
  int i=0;
  do{
    c = mygetchar();
    putchar(c);
    i++;
  }
  while(c != EOF);
  return 0;
}

1 个答案:

答案 0 :(得分:1)

仔细考虑你的缓冲区。函数调用结束时缓冲区会发生什么?它消失了。

这意味着,对于1024次调用中的1023次,您的缓冲区将被整合,并且您的偏移量将指向无意义的数据。


基本上你也需要缓冲区的全局变量:

static char buf[BUF_SIZE];
static size_t bufCur = 0;
static size_t bufEnd = 0;

int mygetchar(void)
{
    // ...
}

(请注意,当您的代码全部在一个文件中时,静态几乎毫无意义。如果您要将mygetchar拉入标题和实现文件中,您可能希望使用静态全局以防止它可从同一编译单元外部链接。)

(有趣的事实:0bufCur的{​​{1}}实际上可以隐含。为清楚起见,我会把它们放进去,但standard dictates它们是被零初始化。


正如Jonathan Leffler指出的那样,除非你打算在其他地方使用缓冲区(我不知道它会在哪里),否则就不需要全局了。您可以在函数内部使用静态变量:

bufEnd