io编程.docx
- 文档编号:5843340
- 上传时间:2023-01-01
- 格式:DOCX
- 页数:12
- 大小:23.66KB
io编程.docx
《io编程.docx》由会员分享,可在线阅读,更多相关《io编程.docx(12页珍藏版)》请在冰豆网上搜索。
io编程
Linux文件的IO编程应该算是每个入门者最先涉及的,我也不例外。
希望通过BLOG的形式,记录下自己每天学习的点点滴滴,我相信滴水穿石,尽管记录的文字都比较简单,对于高手而言抑或没有什么技术含量,但我坚信坚持到最后,就是大牛。
好了,废话说了不少了,开始我的笔记吧。
LINUX下对文件的操作同其它平台系统一样,无外乎创建文件,打开文件,关闭文件,读文件,写文件,拷贝文件,对文件进行权限的控制和管理(这涉及到锁,以后再讨论),另外在这里有一点一定要牢记,那就是在Linux操作系统里,硬件设备也当作文件来对待,我认为这样最大的好处是可以实现文件和设备的统一管理,比如我在上面提到的操作(打开文件,关闭文件,读文件,写文件.....),也通用于硬件设备的操作(打开设备,关闭设备,读设备件,写设备......).明白了这一点,就可以很发挥想象怎么去搞定串口,并口,USB设备........等一系列外围设备了.(是不是很吃惊).
文件IO操作是Linux环境编程基础中的基础.语法和API上看似简单,但真正的应用起来,有时恐怕并不如我最开始想象的那么轻松,所以既然是菜鸟入门,还是要把基础打好.为了让自己找到乐趣和自信,我决定从最简单的函数开始.creat创建文件.
create函数的原型如下:
(大家可以查询manpages.chm)
1.2.intcreat(constchar*pathname,mode_tmode);
参数代表的意思,manpages里讲得确实已经非常清楚了.下面我写了一个简单的例子.(这个例子确实是太简单啦,但是养成动手的好习惯会让每一位程序员受益)
#include
#include
#include
#include
#include
void create_file(char*filename){
if(creat(filename,0755)<0){
printf("createfile%sfailure!
\n",filename);
exit(EXIT_FAILURE);
}else{
printf("createfile%ssuccess!
\n",filename);
}
}
intmain(intargc,char*argv[]){
inti;
if(argc<2){
perror("youhaven'tinputthefilename,pleasetryagain!
\n");
exit(EXIT_FAILURE);
}
for(i=1;i create_file(argv[i]); } exit(EXIT_SUCCESS); } 这个例子没有太多要说的了,但还是想啰嗦一下,创建文件时,脑海里为何飘出一个0755,这是文件的读写执行权限,就是RWX和421码的对应关系相加,manpages里也有详细说明 运行的结果如下: [linuxidc@localhostProject]$./createtemp1temp2 createfiletemp1success! createfiletemp2success! 前一篇说下了creat创建文件,后来我突发其想,creat能不能创建设备呢? 创建实实在在的硬件设备当然是不可能的了,能不能创建逻辑设备呢,希望有高手能帮我回答这个问题.在此不胜感激.这里再来说一下,打开文件和关闭文件的操作open,打开manpages查找open,发现open有两个函数原型,只是参数的个数不一样,在JAVA中这叫重载,原型如下: intopen(constchar*pathname,intflags); intopen(constchar*pathname,intflags,mode_tmode); 哦,对了,前一篇我忘了讲了,其实open同样有创建文件的功能,利用其参数就能实现,creat仅仅是创建一个文件,而open不仅可以创建文件,创建文件后会把所创建的文件直接打开,方便后续操作. 这里有几点可以思考,当我们要创建一个文件时,然后对文件进行相关读写操作时,我们是用creat还是open? 这不废话吗? 当然是用open一步到位啦,省得创建了文件再来调用open.另外creat和open在执行完之后分别返回些什么,让我们知道执行的结果如何? 这里我们要先了解另外一个概念,文件描述符,如果不清楚,先去翻翻教材,我在这种里简单地将文件描述符理解为,linux系统中,对文件的唯一标识,我们在编程时通常这么定义这个变量intfd;fd一看就明白了吧,只要你英语不是白痴,filedescriptor.是int类型的,如果open和creat一个文件成功的话,就会返回此文件的描述符是一个大于0的整数.所以当我们调用open和creat之后我们可以根据其返回值是否大于0判断执行是否OK,如是不OK,就错误处理或搞其它的操作也行,随你便了. 刚才列出了open的两个不同的函数原型,也说到了open有创建文件的功能,这里可以一起发出两个疑问,为什么open要有两个函数实现? 如何用open来创建文件呢? 能产生这两个疑问真是太好了.比较下那两个open的原型,发现只是多了一个mode_t类型的参数啊.前一篇其实用过mode_t这个参数了,我当时头脑发热给创建的文件,设置mode_t的值为0755,就是RWX权限.你可以继续思考,为什么打开一个文件时,一个需要权限参数,一个不需要呢,谜底终于被你揭开了.因为当我们用open创建一个文件时,我们希望创建文件时就给文件赋上相应的权限,而如果仅仅是打开一个已存在的文件或设备,这个权限就不需要了,其实这里还是没有说到重点.下面通过真实的例子来说说,是怎么一回事 #include #include #include #include #include intmain(intargc,char*argv[]){ intfd; if(argc<2){ puts("pleaseinputtheopenfilepathname! \n"); exit (1); } //如果flag参数里有O_CREAT表示,该文件如果不存在,系统则会创建该文件,该文件的权限由第三个参数决定,此处为0755 //如果flah参数里没有O_CREAT参数,则第三个参数不起作用.此时,如果要打开的文件不存在,则会报错. //所以fd=open(argv[1],O_RDWR|O_TRUNC),仅仅只是打开指定文件 if((fd=open(argv[1],O_CREAT|O_RDWR|O_TRUNC,0755))<0){ perror("openfilefailure! \n"); exit (1); }else{ printf("openfile%d success! \n",fd); } close(fd); exit(0); } 这段代码并没有把open和close的功能表现得很完全,但是基本上就是参数的不同,而产生不同的功能了,多查API. 一、打开/关闭文件 1 名称: open 目标: 打开一个文件。 头文件: #include #include #include 函数原形: intopen(constchar*pathname,intflags); intopen(constchar*pathname,intflags,mode_tmode); 参数: pathname文件名 flags打开模式 返回值: -1遇到错误 int打开成功,返回文件描述符。 这个系统调用在进程和文件之间建立一条连接,这个连接被称为文件描述符,它就像一条由进程通向内核的管道。 要打开一个文件,必须指定文件名和打开模式,有3种打开模式: 只读,只写,可读可写,分别对应于O_RDONLY,O_WRONLY,O_RDWR,这在头文件/usr/include/fcntl.h中有定义。 打开文件是内核提供的服务,如果在打开过程中内核检测到任何错误,这个系统调用就会返回-1。 错误的类型是各种各样的,如: 要打开的文件不存在。 即使文件存在可能因为权限不够而无法打开,在open的联机帮助中列出了各种可能的错误,大家可以看看。 UNIX允许一个文件被多个进程访问,也就是说当一个文件被一个进程打开后,这个文件还可以被其它进程打开。 如果文件被顺利打开内核会返回一个正整数的值,这个数值就叫文件描述符,文件描述符是是一个简单的整数,用以标明每一个被进程所打开的文件,描述符0代表标准输出,对应的宏是STDOUT_FILENO,描述符1代表标准输入,对应的宏为STDIN_FILENO,描述符2代表标准错误输出,对应的宏为STDERR_FILENO,系统给进程分配描述符都是从3开始的,如果同时打开好几个文件,它们所对应的的文件描述符是不同的,如果一个文件打开多次,对应的文件描述符也不相同。 必须通过文件描述符对文件操作。 下面的程序可以证明这一点。 /*1_1.c*/ #include #include #include intmain(intac,char*av[]) { intfd; intsize; charbuf[1024]; if(ac==1) printf(“pleaseinputfile! \n”); else { while(--ac) { printf(“file: %s\n”,av[ac]); fd=open(av[ac],O_RDONLY); printf(“fd,%d\n”,fd); size=read(fd,buf,sizeof(buf)); printf(“fd,%d\n”,size); printf(“%s”,buf); } } close(fd); } 我们编译一下 [root@LINUXroot]#cc–oshow_readshow_read.c 运行 [root@LINUXroot]#./show_readshow_read.c 下面是运行结果。 file: show_read.c fd: 3 size: 423 #include …… 我们可以看出此次打开文件的文件描述符是3,如果我们执行下面的语句。 [root@LINUXroot]#./show_readshow_read.cshow_read.c 下面是运行结果: file: 3 size: 423 #include …… file: 4 size432 #include …… 可以看到,我们第一次打开文件的描述符是3,第二次打开文件的文件描述符是4。 Open函数的第二个功能是创建一个新文件并把它打开,其中有几个宏定义对于着flags参数: O_CREAT如果打开文件不存在open就创建一个文件。 O_TRUNC如果打开的文件已经存在open就把原文件清空,长度置为0。 所有我们利用open(pathname,O_WRONLY|O_CREAT|O_TRUNC,0777); 下面是一个例子 /*1_2.c*/ #include #include #include #include charbuf[]=”abcdefg”; intmain(intargc,char*argv[]) { intfd; if((fd=open(argv[1],O_RDWR|O_CREAT|O_TRUNC,0777))==-1) perror(“error”); if(write(fd,buf,7)! =7) perror(“error”); if(read(fd,buf,sizeof(buf))<0) perror(“error”); printf(“%s\n”,buf);: } 2. 名称: close 目标: 关闭一个文件。 头文件: #include 函数原形: intclose(intfd) 参数: fd文件描述符 返回值: -1遇到错误 int关闭成功,返回文件描述符。 Close这个系统调用会关闭进程和文件fd之间的连接,如果关闭过程中出现错误,close返回-1,如: fd所指的文件并不存在。 关闭成功则返回文件描述符。 3. 名称: creat 目标: 创建/重写一个文件 头文件: #include #include #include 函数原形: intcreat(constchar*pathname,mode_tmode) 参数: pathname文件名 mode访问模式 返回值: -1遇到错误 \ fd创建成功,返回文件描述符 Creat告诉内核创建一个名为filename的文件,如果这个文件不存在,就创建它,如果已经存在,就把它的内容清空,把文件的长度设为0。 如果内核成功地创建了文件,那么文件的许可位(permissionbits)被设置为由第二个参数mode所指定的值.如: fd=creat(“addressbook”,0644); 创建一个名为addressbook的文件,如果文件不存在,那么文件的许可位被设为rw-r-r—. 如果文件已存在它的内容会被清空。 任一情况下,fd都会是指向addressbook的文件描述符。 二、文件的读取和写入 4. 名称: read 目标: 把数据读到缓冲区。 头文件: #include 函数原形: ssize_tread(intfd,void*buf,size_tcount) 参数: fd文件描述符 buf用来存放数据的目的缓冲区 count要读取的字节数 返回值: -1遇到错误 numread成功关闭,返回所读取的字节数目。 read这个系统调用请求内核从fd所指定的文件中读取qty字节的数据,存放到buf所指定的内存空间中,内核如果成功地读取了数据,就返回所读取的字节数目。 否则返回-1。 当文件的字节数没有你想要的那么多时,read就会判断下一个数值是不是’\0’,如果是就停止读取,然后退出。 numread返回的是’\0’之前的字节数,也就是是原文件的字节数而不是你想读的字节数。 (一) linux文件的IO编程应该算是每个入门者最先涉及的,我也不例外。 希望通过BLOG的形式,记录下自己每天学习的点点滴滴,我相信滴水穿石,尽管记录的文字都比较简单,对于高手而言抑或没有什么技术含量,但我坚信坚持到最后,就是大牛。 好了,废话说了不少了,开始我的笔记吧。 LINUX下对文件的操作同其它平台系统一样,无外乎创建文件,打开文件,关闭文件,读文件,写文件,拷贝文件,对文件进行权限的控制和管理(这涉及到锁,以后再讨论),另外在这里有一点一定要牢记,那就是在Linux操作系统里,硬件设备也当作文件来对待,我认为这样最大的好处是可以实现文件和设备的统一管理,比如我在上面提到的操作(打开文件,关闭文件,读文件,写文件.....),也通用于硬件设备的操作(打开设备,关闭设备,读设备件,写设备......).明白了这一点,就可以很发挥想象怎么去搞定串口,并口,USB设备........等一系列外围设备了.(是不是很吃惊). 文件IO操作是Linux环境编程基础中的基础.语法和API上看似简单,但真正的应用起来,有时恐怕并不如我最开始想象的那么轻松,所以既然是菜鸟入门,还是要把基础打好.为了让自己找到乐趣和自信,我决定从最简单的函数开始.creat创建文件. create函数的原型如下: (大家可以查询manpages.chm) intcreat(constchar*pathname,mode_tmode); 参数代表的意思,manpages里讲得确实已经非常清楚了.下面我写了一个简单的例子.(这个例子确实是太简单啦,但是养成动手的好习惯会让每一位程序员受益) #include #include #include #include #include void create_file(char*filename){ if(creat(filename,0755)<0){ printf("createfile%sfailure! \n",filename); exit(EXIT_FAILURE); }else{ printf("createfile%ssuccess! \n",filename); } } intmain(intargc,char*argv[]){ inti; if(argc<2){ perror("youhaven'tinputthefilename,pleasetryagain! \n"); exit(EXIT_FAILURE); } for(i=1;i create_file(argv[i]); } exit(EXIT_SUCCESS); } 这个例子没有太多要说的了,但还是想啰嗦一下,创建文件时,脑海里为何飘出一个0755,这是文件的读写执行权限,就是RWX和421码的对应关系相加,manpages里也有详细说明 运行的结果如下: [hacker@localhostProject]$./createtemp1temp2 createfiletemp1success! createfiletemp2success! (二) 前一篇说下了creat创建文件,后来我突发其想,creat能不能创建设备呢? 创建实实在在的硬件设备当然是不可能的了,能不能创建逻辑设备呢,希望有高手能帮我回答这个问题.QQ: 262482485在此不胜感激.这里再来说一下,打开文件和关闭文件的操作open,打开manpages查找open,发现open有两个函数原型,只是参数的个数不一样,在JAVA中这叫重载,原型如下: intopen(constchar*pathname,intflags); intopen(constchar*pathname,intflags,mode_tmode); 哦,对了,前一篇我忘了讲了,其实open同样有创建文件的功能,利用其参数就能实现,creat仅仅是创建一个文件,而open不仅可以创建文件,创建文件后会把所创建的文件直接打开,方便后续操作. 这里有几点可以思考,当我们要创建一个文件时,然后对文件进行相关读写操作时,我们是用creat还是open? 这不废话吗? 当然是用open一步到位啦,省得创建了文件再来调用open.另外creat和open在执行完之后分别返回些什么,让我们知道执行的结果如何? 这里我们要先了解另外一个概念,文件描述符,如果不清楚,先去翻翻教材,我在这种里简单地将文件描述符理解为,linux系统中,对文件的唯一标识,我们在编程时通常这么定义这个变量intfd;fd一看就明白了吧,只要你英语不是白痴,filedescriptor.是int类型的,如果open和creat一个文件成功的话,就会返回此文件的描述符是一个大于0的整数.所以当我们调用open和creat之后我们可以根据其返回值是否大于0判断执行是否OK,如是不OK,就错误处理或搞其它的操作也行,随你便了. 刚才列出了open的两个不同的函数原型,也说到了open有创建文件的功能,这里可以一起发出两个疑问,为什么open要有两个函数实现? 如何用open来创建文件呢? 能产生这两个疑问真是太好了.比较下那两个open的原型,发现只是多了一个mode_t类型的参数啊.前一篇其实用过mode_t这个参数了,我当时头脑发热给创建的文件,设置mode_t的值为0755,就是RWX权限.你可以继续思考,为什么打开一个文件时,一个需要权限参数,一个不需要呢,谜底终于被你揭开了.因为当我们用open创建一个文件时,我们希望创建文件时就给文件赋上相应的权限,而如果仅仅是打开一个已存在的文件或设备,这个权限就不需要了,其实这里还是没有说到重点.下面通过真实的例子来说说,是怎么一回事 #include #include #include #include #include intmain(intargc,char*argv[]){ intfd; if(argc<2){ puts("pleaseinputtheopenfilepathname! \n"); exit (1); } //如果flag参数里有O_CREAT表示,该文件如果不存在,系统则会创建该文件,该文件的权限由第三个参数决定,此处为0755 //如果flah参数里没有O_CREAT参数,则第三个参数不起作用.此时,如果要打开的文件不存在,则会报错. //所以fd=open(argv[1],O_RDWR|O_TRUNC),仅仅只是打开指定文件 if((fd=open(argv[1],O_CREAT|O_RDWR|O_TRUNC,0755))<0){ perror("openfilefailure! \n"); exit (1); }else{ printf("openfile%d success! \n
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- io 编程