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