Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
读取除最后一个缓冲区外的所有缓冲区(在C中)_C - Fatal编程技术网

读取除最后一个缓冲区外的所有缓冲区(在C中)

读取除最后一个缓冲区外的所有缓冲区(在C中),c,C,我想从管道中读取除最后一个缓冲区之外的所有缓冲区。这是我当前的代码: while(read(server_to_client,serverString2,sizeof(serverString2))){ printf("Client : PID %d",getpid()); printf("-Target>>%s<<", clientString2); printf(serverString2); } while(读取(服务器到客户端,服务器字符串2,

我想从管道中读取除最后一个缓冲区之外的所有缓冲区。这是我当前的代码:

while(read(server_to_client,serverString2,sizeof(serverString2))){
   printf("Client : PID %d",getpid());
   printf("-Target>>%s<<", clientString2);
   printf(serverString2);
}
while(读取(服务器到客户端,服务器字符串2,大小为(服务器字符串2))){
printf(“客户端:PID%d”,getpid());

printf(“-Target>%s您真的需要避免读取最后一个缓冲区吗?还是仅仅避免对它做任何事情?可能是不同形式的循环?可能是在读取每个缓冲区后检查eof()

while(read(server_to_client,serverString2,sizeof(serverString2)))
{
   if (! eof(server_to_client))
   {
      printf("Client : PID %d",getpid());
      printf("-Target>>%s<<", clientString2);
      printf(serverString2);
   }
   else
   {
      // do special stuff for the last buffer here
   }
}
while(读取(服务器到客户端,服务器字符串2,大小为(服务器字符串2)))
{
如果(!eof(服务器到客户端))
{
printf(“客户端:PID%d”,getpid());

printf(“-Target>>%s你不能。这个问题根本没有意义

问题假设“缓冲区”是数据的一个有意义的度量单位,但事实并非如此。特别是的第三个参数read(2)是要读取的最大字节数,但由于大量原因,调用实际传输的字节数可能会减少,到达数据末尾的字节数只有一个。实际上,当要读取的文件描述符连接到管道(如您所说)时,其他原因比连接到文件时更可能出现。请注意这意味着如果要检查
read()
读取的数据,必须始终捕获其返回值,否则无法知道缓冲区中有多少包含有效数据

更一般地说,您无法从管道的打开文件描述符中判断有多少数据可从中读取。您需要在协议中包含该信息(例如,HTTP的
内容长度
标头),或以某种方式进行带外通信。这仍然不能告诉您现在有多少数据可供读取,但它可以帮助您确定何时停止尝试读取更多数据


编辑以添加:

如果你问是因为你想避免处理部分填充的缓冲区,那么你就没有运气了。至少,当数据被过早截断时,你需要为部分填充的缓冲区做好准备。除非要传输的数据的总大小一定是所选缓冲区大小的倍数,否则你也必须这样做准备在数据末尾处理一个部分缓冲区。但是,您可以避免重复使用“代码>> Read())/代码> ING处理数据中间的部分缓冲区,直到填充缓冲区,可能通过包装函式,例如:

ssize_t read_fully(int fd, void *buf, size_t count) {
    char *byte_buf = buf;
    ssize_t bytes_remaining = count;

    while (1) {
        ssize_t nread = read(fd, byte_buf, bytes_remaining);

        if ((nread <= 0) || ((bytes_remaining -= nread) <= 0)) {
            break;
        }
        byte_buf += nread;
        bytes_remaining -= nread;
    }

    return count - bytes_remaining;
}
ssize\u t read\u完全读取(int fd,void*buf,size\u t count){
char*byte_buf=buf;
剩余字节数=计数;
而(1){
ssize\u t nread=读取(fd,字节,剩余字节);

如果((nread)那么您的软件如何识别“最后一个”缓冲区?软件只是在循环中读取服务器端的所有缓冲区,而不是逐个读取。它不识别任何其他
printf(serverString2);
是一个非常坏的习惯。如果字符串中有
%
怎么办?如果缓冲区后面没有NUL字符怎么办?注意
read()
可以返回-1,这不会导致循环退出。我在服务器端处理所有检查。我只是在使用客户端打印结果。如何避免处理最后一个缓冲区?C提供了一套灵活的条件语句。可以使用其中任何一个来避免处理最后一个缓冲区(同样的方法)前提是您可以解决识别最后一个的关键问题(可能在阅读后)。如果您既不知道带外数据,也不知道协议中的某项数据的预期时间,则在到达终点之前,您无法知道即将到达该数据。如果必须了解这一点,则最好将整个传输缓存在内存或磁盘中,以计算其大小,然后对其进行处理我需要以不同的方式打印最后一个缓冲区。我只想让最后一个缓冲区产生不同的结果,所以,在我添加的if子句后面加一个else(nvm,我为您更新了答案)