【问题标题】:C - does read() add a '\0'?C - read() 添加一个'\ 0'吗?
【发布时间】:2015-08-25 20:07:02
【问题描述】:

必须吗?我一直对这类东西很模糊,但如果我有类似的东西:

char buf[256];
read(fd, buf, 256);

write(fd2, buf, 256);

除了那些函数返回 -1 的情况之外,这里是否有可能出错?

如果它只读取 40 个字符,它会在后面加上 \0 吗? (并且会写识别 \0 并停止? 另外,如果要读取 256 个字符,那 256 个字符后面有 \0 吗?

【问题讨论】:

  • 没有。 read(2) 不会添加零终止符,即使它只能读取少于请求的字节数。
  • 当你有这样的疑问时,最快最可靠的方法就是阅读文档。有在线资源,有手册页等。
  • 据我所知,除了实际读取的数据之外,标准对 buf 的内容没有任何评论。也许我们需要一个[语言律师]。不过,将任何东西放在那里是非常不寻常的。
  • @alk 未记录的内容未定义。
  • 需要使用read的返回值...bytesread = read(fd, buf, 256); write(fd, buf, bytesread);

标签: c unix io posix unbuffered


【解决方案1】:

read() 是否添加了 '\0'?

不,它没有。它只是读取。

来自read()'s documentation

read() 函数应尝试从与打开的文件描述符 fildes 关联的文件中读取 nbyte 字节到由 buf 指向的缓冲区中。


除了那些函数返回-1的情况之外,这里是否有可能出错?

read() 可能返回 0 指示文件结束。

如果读取(也从套接字描述符)read() 读取的字节数不一定与告知的一样多。因此,在这种情况下,不仅要针对-1 测试读取的结果,还要将其与函数被告知要读取的字节数进行比较。


一般说明:

函数执行文档中的操作(至少对于 C 语言的正确实现而言)。您的两个假设(自动设置 0 终止,检测后者)都没有记录。

【讨论】:

  • read() 也可能返回一个介于 0 和 256 之间的值,即使 fd 不是套接字描述符也是如此。应该对任何read() 进行短读检查。
【解决方案2】:

没有。

考虑读取二进制数据(例如,文件中的照片):添加额外字节会损坏数据。

【讨论】:

    【解决方案3】:

    来自手册页:

    Synopsis
    
    #include <unistd.h>
    ssize_t read(int fd, void *buf, size_t count);
    

    那是void *,而不是char *,因为read() 读取的是字节,而不是字符。它读取零字节以及任何其他值,并且由于字节块(与字符串相反)不会终止,read() 不会。

    【讨论】:

      【解决方案4】:

      有必要吗?

      除非从文件中成功读取的数据包含'\0'...

      除了那些函数返回-1的情况之外,这里是否有可能出错?

      是的。 read 返回实际读取的字节数(或表示失败的负值)。如果您选择write 超过该字节数到您的其他文件中,那么您正在写入潜在的垃圾。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-01-05
        • 1970-01-01
        • 1970-01-01
        • 2020-05-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多