read和write函数的理解

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字节大小都写进去了,最后导致乱码。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zedjay_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值