//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