【问题标题】:Ignore \0 chars when writing to file C写入文件 C 时忽略 \0 字符
【发布时间】:2014-01-04 15:36:49
【问题描述】:

我正在编写简单的服务器 - 客户端应用程序。在服务器端,我接收 char 数据数组(具有 const 大小)。但是最后一个 char 数组可以有空字节。

我将收到的数组附加到循环文件中。这是代码:

char buffer[256];
/* ...  */
FILE *file;
file = fopen(file_name,"ab+");
for (i = 0; i < parts; ++i) {
    if ((length = recv(sockfd, buffer, 256, 0)) < 0) {
        /* recv failed  */
    }
    send(sockfd, "OK", 2, 0);
    fwrite(buffer, 1, 256, file);
}
fclose(file);

例如: ... Quisque dignissim turpis sapien,非 facilisis risus gravida 在。 \00\00\00\00

有什么方法可以跳过最后一个 \0 字符吗?还是我必须逐字节复制最后一个数组。

【问题讨论】:

    标签: c arrays file fwrite


    【解决方案1】:

    使用

    fwrite(buffer, 1, length, file);
    

    这只会写入您实际收到的字符数。如果额外的\0 是数据包的一部分,它将被写入,否则不会。

    如果您收到 \0 字符作为数据包的一部分但您不想写它们,那么您必须这样做:

    fwrite(buffer, 1, strlen(buffer), file);
    

    【讨论】:

    • 要么使用二进制,要么使用零作为缓冲区的一部分,您必须写入它们。在这种情况下,您必须发送作为协议的一部分发送的字节数。在您的示例中,听起来好像您只是发送字符串并在缓冲区中有一些额外的零。或者,如果您事先已经知道收到了多少字节,则必须通过将 receiveed 的内容相加来跟踪它,并在收到所有预期的字节后停止写入。
    • 是的,你是对的。 fwrite(buffer, 1, length, file); 这就像魅力。我只是需要更多的咖啡......
    【解决方案2】:

    如果recv 函数的返回值是缓冲区中读取字节的长度,则使用它来代替fwrite 调用中的缓冲区大小

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-05
      • 2021-07-19
      • 1970-01-01
      • 2018-04-04
      • 1970-01-01
      • 2021-10-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多