繁体   English   中英

从未知大小的文件描述符中完全读取

[英]Reading fully from file descriptor of unknown size

我已经使用过管道,并且必须从该管道中阅读。 但是问题是这样的:

ssize_t read(int fd, void *buf, size_t count)

我不知道在管道的读取端中存储了多少个字符,因此我无法分配一些要计数的数字 我需要将此存储在缓冲区中。

如何在此管道中存储多少字符?

带着敬意

只需使用大小适当的缓冲区,并尽可能多地读取。 重复一遍。 该函数返回读取的字节数。

我不知道管道的读取端中存储了多少个字符

不用担心 有优点(例如原子性),即刻尝试不写/读超过PIPE_BUF个字节。 实际上,无论如何,您可能都会得到一堆短篇小说。

#define READ_BUFFER_SIZE PIPE_BUF

unsigned char mybuffer[READ_BUFFER_SIZE];

ssize_t bytesread = 1;

while ((bytesread = read(pipefd, mybuffer, READ_BUFFER_SIZE)) > 0)
{
    concat to bigger buffer, realloc if necessary
}

您可以简单地请求不超过缓冲区大小的字符数,然后在循环中重复执行此操作,例如:

char* buf = malloc(1024);
do {
   bytes_read = read(fd, buf, 1024);
   // store buf somewhere else so you can use it in the next iteration
} while (bytes_read > 0)
free(buf);

您无需事先知道有多少字节并将其作为计数值传递。 您可以定义期望的最大数据大小的缓冲区,并从fd中读取数据,直到数据存在为止。

char buf[MAX_DATA_SIZE] = {0};

bytes_read = 0;
while(n > 0)
{
    n = read(fd,buf+bytes_read,MAX_DATA_SIZE)
    bytes_read = bytes_read + n;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM