c - C 中具有固定大小缓冲区的 read() 函数无法返回预期结果

标签 c

据我了解,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/

相关文章:

c - 为什么将一个小 float 添加到一个大 float 中只会删除小 float ?

C中比较两个char数组的内容

c# - 访问冲突异常 : Attempted to read/write protected memory

c - 如何在文本文件中插入N个空格

c++ - Openssl aes.h [链接器错误] undefined reference

c - C 中的 For 循环出现奇怪的错误

c - 传递一维数组、二维数组和指针数组

c - Eclipse 中的 GDB 调试器找不到 FILE

c - 链表的结构与存储中的常见结构相比有什么特别之处吗?

C - 将字符串添加到数组 x 中并将其从数组 y 中删除