io编程.docx

上传人:b****5 文档编号:5843340 上传时间:2023-01-01 格式:DOCX 页数:12 大小:23.66KB
下载 相关 举报
io编程.docx_第1页
第1页 / 共12页
io编程.docx_第2页
第2页 / 共12页
io编程.docx_第3页
第3页 / 共12页
io编程.docx_第4页
第4页 / 共12页
io编程.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

io编程.docx

《io编程.docx》由会员分享,可在线阅读,更多相关《io编程.docx(12页珍藏版)》请在冰豆网上搜索。

io编程.docx

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1