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

//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 MAXSIZE
int 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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值