read write lseek代码分析(非己品)

    技术2022-06-26  60

    //io_read_write_lseek.size表示读取写入的字符串长度!当size<0的时候,read 或者 write等没有读取或者写入成功。

     

    #include <unistd.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <stdlib.h>#include <stdio.h>#define MAXSIZEint main(void)    //定义一个int型的main函数{    int i,fd,size,len;  //fd为文件描述符     char *buf="I love"; //定义指针指向char型值"I love",buf为写入数据缓存(理解为写入的数据)    char buf_r[10];     //定义一个一维数组,*buf的值不能大于10个字节    len=strlen(buf);    //strlen(buf)计算内存中存入的字符个数 ,返回字符串长度(到第一个/0)    if((fd=open("/tmp/hello.c",O_CREAT | O_TRUNC | O_RDWR,0655))<0) 

    //这里是open原型,如果fd(文件描述符)<0的时候,表示出错。    {        perror("open:");   

    //open函数如成功执行则返回一个非负文件描述符。如若出错则返回-1,这里检测是否文件描述符对应到什么函数中        exit(1);  //异常退出,0为正常推出,前面的第二笔记已经说明0,1,2的退出含义      }    else        printf("open file:hello.c %d/n",fd); //否则建立hello.c文件    if((size=write(fd,buf,len))<0) //调用write函数将buf中的内容写入到刚才建立的hello.c文件,这里注意fd表示文件描述符,buf表示“I love”的在内存中的地址,len表示"I love"的字符长度    {        perror("write:");    //假设write出错        exit(1);             //异常退出    }    else        printf("write:%s/n",buf); //写入数据,内容为*buf    lseek(fd,0,SEEK_SET);         //函数原型,0表示从第一个字节位置写入数据,SEEK_SET为当前位置为文件的开头,新位置为偏移量的大小,大小为0

        if((size=read(fd,buf_r,10))<0) //调用lsseek函数将文件指针移动到文件起始,并读取10个字节,这里10在前面的数组中定义了,当size()<0的时候执行perror()函数    {        perror("read:");          //调用perror函数,调用read出错时        exit(1);                 //异常退出    }    else                                               printf("read form file:%s/n",buf_r);   //否则正常读取显示buf_f    if(close(fd)<0)                            //调用close函数,作为关闭文件。当close(fd)小于0的时候执行perror函数    {        perror("close:");                      //调用perror函数,当出错时        exit(1);                              //不正常退出    }    else        printf("close hello.c/n");                 //否则正常关闭hello.c        exit(0);                                   //正常退出}程序流程大致思路:

    首先在定义buf指针所指向的的值为"I love"然后定义所写入的字节数不能大于10,用buf_r[10]定义。定义一个char型变量判断写入内存的字节数,使用strlen函数。调用open函数创建一个/tmp/下建立hello.c文件,判断建立成功失败程序将如何运行。再调用write函数将buf中的内容写入到刚才建立的hello.c文件,判断写入成功或失败程序怎么运行。调用lsseek函数将文件指针移动到文件起始,并读取10个字节,判断读取成功或失败程序如何运行。成功输出"I love"失败退出(SEEK_SET表示将文件指针移动到文件起始。)最后调用close()函数,判断成功关闭hello.c文件,失败退出!

    我认为文件描述符结合这个例子最合适理解了。我们可以看到,在代码中我们用到open()函数【建立文件】

    write函数【写入数据】;lseek 函数是用于在指定的文件描述符中将文件指针定位到相应的位置;read函数【读取数据】。在open write lseek中我们都对函数操作成功或者失败做了明确的定义。那么我们就需要思考一个问题,程序或者说编译器是怎么判断成功失败。我们可以理解为当我们新建一个文件的时候,会有一个小家伙捆绑在这个文件上。让系统识别这个文件。如果打开失败,创建失败等等。这个小家伙就没办法捆绑在文件上,那么小家伙就跑去告诉系统我没有被捆绑上,那么系统就会认为是失败,所以使用到exit(1)函数!如果成功了,系统会发现小家伙没有跑过来,系统也就会认为捆绑上了。执行exit(0)。就好比是这个小家伙是程序与系统之间的信使,每个小家伙有自己的编号,他们只对应到一个函数中。这样方面系统去判断到底是那个函数的错误!

     

    文章出处:http://ciwnet.blog.sohu.com/47787474.html


    最新回复(0)