0

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

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

write(fd2, buf, 256);

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

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

4

4 回答 4

8

不。

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

于 2015-06-10T14:02:54.027 回答
8

read() 添加一个 '\0' 吗?

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

来自read()的文档

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


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

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

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


一般注意事项:

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

于 2015-06-10T14:02:57.567 回答
1

从手册页:

Synopsis

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

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

于 2015-06-10T14:05:26.617 回答
0

它必须吗?

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

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

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

于 2015-06-10T14:57:35.450 回答