文章目录
read和write函数的理解
先看代码:
/*
* @Author: sanjayzhong
* @Github: https://github.com/sanjayzzzhong
* @Date: 2019-09-05 13:33:28
*/
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#define BUFSIZE 4096
int main(){
char buf[BUFSIZE];
int read_size = read(STDIN_FILENO, buf, sizeof(buf)); //这里用sizeof(buf) 来指定最大可以读取多少数据
//read_size 返回的是读取到多少数据
printf("read_size = %d\n", read_size);
int write_size = write(STDOUT_FILENO, buf, read_size);
//write_size 返回的是写入多少数据
printf("write_size = %d\n", write_size);
return 0;
}
编译运行,然后输入
hello world
最后终端返回:
read_size = 12
hello world
write_size = 12
-
hello world
一共有11个字节,但是读取到的大小是12
,说明read函数是会把换行符读取进来的 -
注意write函数写buf的时候,最后buf的大小要根据read的返回值来填写,否则的话会把整个buf都写出来,有些会乱码。
把代码改动测试一下:
/* * @Author: sanjayzhong * @Github: https://github.com/sanjayzzzhong * @Date: 2019-09-05 13:33:28 */ #include <stdio.h> #include <fcntl.h> #include <unistd.h> #define BUFSIZE 4096 int main(){ char buf[BUFSIZE]; int read_size = read(STDIN_FILENO, buf, sizeof(buf)); //这里用sizeof(buf) 来指定最大可以读取多少数据 //read_size 返回的是读取到多少数据 printf("read_size = %d\n", read_size); //#####################改动的代码###################### //如果将read_size换成sizeof(buf) //int write_size = write(STDOUT_FILENO, buf, sizeof(buf)); //#####################上面改成了sizeof(buf)############### //write_size 返回的是写入多少数据 printf("write_size = %d\n", write_size); return 0; }
编译运行,然后输入
hello world
最后终端出来的结果:
read_size = 12 hello world E�p`�0��`�0��H�0���.&�pp�j�jp>�>`�>� ?ppQH�p&�p��0�� �pQH�p7u'�p`�0�� ��&�p/home/sap_H�p/����;Vrninp/4_Linu`�0���&�pE�p`�0������3&�p��%�pT�&�p�%�pZ'��p�N&�p�0��Y@QH�pp_H�p����;V0�0��Y�����M�p]�6�Z}3�\��np����;VpQH�p`@H�p�0���O&�p��0�� p_H�p �0����0����0��p_H�p�0��@ELF>�@��@8 @IH@@@00P�P�P��j�j v v> v>@R�� ����>��>��pppDD v v> v>P�tdl����Y�YQ�td��0����0��Z'��p��0������p�&�pk|'�pp�0����&�p_o&�pWH�p[>'�p���;��(o���p��0����;��pT�&�p��0��pQH�p_o&�pE�p����pi����%�p��%�pl���pppP�0��p@�0���E�pE�p��p_�g�TH�pp�0��XE�p�IH�p�q&�pXE�p�IH�p��%�p����@�0��P�0���TH�p��0������p�������p���pE�pp_H�p��;�� h�%�p��0����%�p�IH���&�p �&�p�IH�pp_H�p@�0����0����%�p�TH�p��0���%�p�%�p��%�pH@H�p�IH�p���p�%�p�'�+Й pQH�ppQH�p�K'�p��0���&�p(WH�pQH�p�$E�p_o&�pWH�p��;��������p0�0����;��p��0����0��8WH�pWH�p&�be�ZH�p(�0��`�0��WH�p�q&�p`�0��WH�p���p@��0����0���ZH�p����h�;��WH�p `�%�p8�0��-���;V��&�p����;V0���;Vwrite_size = 4096
由上面可得:
读取到hello world的字节为12字节,然后write的时候把整个buf大小,也就是4096字节大小都写进去了,最后导致乱码。