C 读然后写

C 读然后写,c,io,C,Io,在我们这样做之后: int readStat = read(fd, buf, sizeof(buf)); 为什么应该是: int status = write(socket_num, buf, readStat); 而不是 int status = write(socket_num, buf, sizeof(buf)); ?? 因此,与其像手册页所指示的那样传递buf的大小,为什么我们要传递read的返回值 read返回实际读取的字节数,请记住,您可能有一个500字节长的文件,请求读取50

在我们这样做之后:

int readStat = read(fd, buf, sizeof(buf));
为什么应该是:

int status = write(socket_num, buf, readStat);
而不是

int status = write(socket_num, buf, sizeof(buf));
??
因此,与其像手册页所指示的那样传递buf的大小,为什么我们要传递read的返回值

read返回实际读取的字节数,请记住,您可能有一个500字节长的文件,请求读取500字节,但只返回200字节。所以,在返回文件末尾之前,您应该始终使用read循环。TCP/IP读取尤其如此,因为您从缓冲区中提取数据

实际上,如果有足够的字节数,您可能总会从文件中获得所请求的字节数,但从技术上讲,这并不总是正确的


但举个例子,如果你有一个32字节的文件,你有一个500字节的缓冲区。您将只读取32个字节,因此其他500个字节将是垃圾。现在,当您编写新文件时,它的长度是500字节,而不是32字节。

read返回实际读取的字节数,请记住,您可能有一个500字节长的文件,请求读取500字节,但只返回200字节。所以,在返回文件末尾之前,您应该始终使用read循环。TCP/IP读取尤其如此,因为您从缓冲区中提取数据

实际上,如果有足够的字节数,您可能总会从文件中获得所请求的字节数,但从技术上讲,这并不总是正确的


但举个例子,如果你有一个32字节的文件,你有一个500字节的缓冲区。您将只读取32个字节,因此其他500个字节将是垃圾。现在,当您编写新文件时,它的长度是500字节,而不是32字节。

缓冲区可能足够大,可以容纳512字节,但如果文件中只有32字节,则
readStat
包含32字节,你不写以前没有读过的东西。写你读过的东西,不写垃圾。缓冲区可能足够大,可以容纳512字节,但如果文件中只有32字节,那么
readStat
包含32个,你不写以前没有读过的东西。写你读过的东西,不写垃圾。