它必须吗?我一直对这类东西很模糊,但如果我有类似的东西:
char buf[256];
read(fd, buf, 256);
write(fd2, buf, 256);
除了那些函数返回-1的情况之外,这里是否有可能出错?
如果它只读取 40 个字符,它会在后面加上 \0 吗?(并且会写入识别 \0 并停止?另外,如果要读取 256 个字符,那么在这 256 个字符之后是否有 \0?
它必须吗?我一直对这类东西很模糊,但如果我有类似的东西:
char buf[256];
read(fd, buf, 256);
write(fd2, buf, 256);
除了那些函数返回-1的情况之外,这里是否有可能出错?
如果它只读取 40 个字符,它会在后面加上 \0 吗?(并且会写入识别 \0 并停止?另外,如果要读取 256 个字符,那么在这 256 个字符之后是否有 \0?
不。
考虑读取二进制数据(例如文件中的照片):添加额外字节会损坏数据。
read() 添加一个 '\0' 吗?
不,它没有。它只是读取。
来自read()
的文档:
read() 函数应尝试从与打开的文件描述符 fildes 关联的文件中读取 nbyte 字节到由 buf 指向的缓冲区中。
除了那些函数返回-1的情况之外,这里是否有可能出错?
read()
可能返回0
指示文件结束。
如果读取(也从套接字描述符)read()
读取的字节数不一定与它被告知的一样多。因此,在这种情况下,不仅要测试 read 的结果-1
,还要将其与函数被告知要读取的字节数进行比较。
一般注意事项:
函数执行文档中的操作(至少对于 C 语言的正确实现)。您的两个假设(自动设置 0 终止,检测后者)都没有记录。
从手册页:
Synopsis
#include <unistd.h>
ssize_t read(int fd, void *buf, size_t count);
也就是说void *
,不是char *
,因为read()
读取的是字节,而不是字符。它读取零字节以及任何其他值,并且由于字节块(与字符串相反)没有终止,read()
因此不会。
它必须吗?
除非从文件中成功读取的数据包含'\0'
...
除了那些函数返回-1的情况之外,这里是否有可能出错?
是的。read
返回实际读取的字节数(或表示失败的负值)。如果您选择将write
超过该数量的字节写入其他文件,那么您正在写入潜在的垃圾。