我试图在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;
}
答案 0 :(得分:1)
仔细考虑你的缓冲区。函数调用结束时缓冲区会发生什么?它消失了。
这意味着,对于1024次调用中的1023次,您的缓冲区将被整合,并且您的偏移量将指向无意义的数据。
基本上你也需要缓冲区的全局变量:
static char buf[BUF_SIZE];
static size_t bufCur = 0;
static size_t bufEnd = 0;
int mygetchar(void)
{
// ...
}
(请注意,当您的代码全部在一个文件中时,静态几乎毫无意义。如果您要将mygetchar拉入标题和实现文件中,您可能希望使用静态全局以防止它可从同一编译单元外部链接。)
(有趣的事实:0
和bufCur
的{{1}}实际上可以隐含。为清楚起见,我会把它们放进去,但standard dictates它们是被零初始化。
正如Jonathan Leffler指出的那样,除非你打算在其他地方使用缓冲区(我不知道它会在哪里),否则就不需要全局了。您可以在函数内部使用静态变量:
bufEnd