据我了解,C 中的 read()
函数应该只读取用户请求的数据,因此由于文件是可查找的以迭代文件,因此代码应该如下所示:
int f = open("test.txt", O_RDONLY);
// buffer size 10
char file_buffer[10];
size_t file_nbytes;
file_nbytes = sizeof(file_buffer);
while(read(f, file_buffer, file_nbytes) != 0) {
printf("%s\n", (char *) file_buffer);
}
但是如果缓冲区大小固定,在最后一批读取时,会有一些前一批的字符重复打印出来,例如:
Previous batch:
Read input (descriptor 3): 10 chars
g and news
Last batch:
Read input (descriptor 3): 3 chars
.
nd news
重复打印第一个新闻
。
我尝试在每次读取之前清除缓冲区,但仍然不起作用,那么我应该如何解决这个问题?
最佳答案
不用担心清除缓冲区,你会无缘无故地失去效率。在打印之前只需 null 终止即可。 read
返回实际读取的字节数,这正是您所需要的。例如
ssize_t n_read;
while((n_read = read(f, file_buffer, file_nbytes-1)) > 0) {
file_buffer[n_read] = '\0';
printf("%s\n", file_buffer);
}
请注意,我检查了 > 0
,因为 read
可能返回 -1。并且您不需要将 file_buffer
转换为 char*
关于c - C 中具有固定大小缓冲区的 read() 函数无法返回预期结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33812517/