io编程Word下载.docx

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

io编程Word下载.docx

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

io编程Word下载.docx

printf("

createfile%sfailure!

\n"

filename);

exit(EXIT_FAILURE);

}else{

createfile%ssuccess!

}

}

intmain(intargc,char*argv[]){

inti;

if(argc<

2){

perror("

youhaven'

tinputthefilename,pleasetryagain!

);

for(i=1;

i<

argc;

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创建一个文件时,我们希望创建文件时就给文件赋上相应的权限,而如果仅仅是打开一个已存在的文件或设备,这个权限就不需要了,其实这里还是没有说到重点.下面通过真实的例子来说说,是怎么一回事

intmain(intargc,char*argv[]){

intfd;

puts("

pleaseinputtheopenfilepathname!

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

openfilefailure!

openfile%d 

success!

fd);

close(fd);

exit(0);

这段代码并没有把open和close的功能表现得很完全,但是基本上就是参数的不同,而产生不同的功能了,多查API.

一、打开/关闭文件

1

名称:

open

目标:

打开一个文件。

头文件:

fcntl.h>

函数原形:

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

unistd.h>

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

……

我们可以看出此次打开文件的文件描述符是3,如果我们执行下面的语句。

[root@LINUXroot]#./show_readshow_read.cshow_read.c

下面是运行结果:

3

423

4

size432

可以看到,我们第一次打开文件的描述符是3,第二次打开文件的文件描述符是4。

Open函数的第二个功能是创建一个新文件并把它打开,其中有几个宏定义对于着flags参数:

O_CREAT如果打开文件不存在open就创建一个文件。

O_TRUNC如果打开的文件已经存在open就把原文件清空,长度置为0。

所有我们利用open(pathname,O_WRONLY|O_CREAT|O_TRUNC,0777);

下面是一个例子

/*1_2.c*/

sys/fcntl.h>

charbuf[]=”abcdefg”;

intmain(intargc,char*argv[])

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)

printf(“%s\n”,buf);

:

2.

close

关闭一个文件。

unistd.h>

intclose(intfd)

fd文件描述符

int关闭成功,返回文件描述符。

Close这个系统调用会关闭进程和文件fd之间的连接,如果关闭过程中出现错误,close返回-1,如:

fd所指的文件并不存在。

关闭成功则返回文件描述符。

3.

creat

创建/重写一个文件

stat.h>

intcreat(constchar*pathname,mode_tmode)

mode访问模式

    \

fd创建成功,返回文件描述符

Creat告诉内核创建一个名为filename的文件,如果这个文件不存在,就创建它,如果已经存在,就把它的内容清空,把文件的长度设为0。

如果内核成功地创建了文件,那么文件的许可位(permissionbits)被设置为由第二个参数mode所指定的值.如:

fd=creat(“addressbook”,0644);

创建一个名为addressbook的文件,如果文件不存在,那么文件的许可位被设为rw-r-r—.

如果文件已存在它的内容会被清空。

任一情况下,fd都会是指向addressbook的文件描述符。

二、文件的读取和写入

4.

read

把数据读到缓冲区。

ssize_tread(intfd,void*buf,size_tcount)

buf用来存放数据的目的缓冲区

count要读取的字节数

numread成功关闭,返回所读取的字节数目。

read这个系统调用请求内核从fd所指定的文件中读取qty字节的数据,存放到buf所指定的内存空间中,内核如果成功地读取了数据,就返回所读取的字节数目。

否则返回-1。

当文件的字节数没有你想要的那么多时,read就会判断下一个数值是不是’\0’,如果是就停止读取,然后退出。

numread返回的是’\0’之前的字节数,也就是是原文件的字节数而不是你想读的字节数。

(一)

linux文件的IO编程应该算是每个入门者最先涉及的,我也不例外。

intcreat(constchar*pathname,mode_tmode);

[hacker@localhostProject]$./createtemp1temp2

(二)

创建实实在在的硬件设备当然是不可能的了,能不能创建逻辑设备呢,希望有高手能帮我回答这个问题.QQ:

262482485在此不胜感激.这里再来说一下,打开文件和关闭文件的操作open,打开manpages查找open,发现open有两个函数原型,只是参数的个数不一样,在JAVA中这叫重载,原型如下:

\n

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

当前位置:首页 > 党团工作 > 其它

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

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