本文章主要是讲解以下的几个函数的应用
他们的主要作用是对文件进行打开,关闭,读取,写入的功能.
其函数原型如下:
===========================================
头文件
#include<sys/types.h>
#include<sys/stat.h>
#include<fentl.h>
原型
int open(const char *pathname,flags,int perms);
参数作用
pathname 被打开的文件名
flag 文件打开的方式
1.O_RDONLY:只读方式打开文件
2.O_WRONLY:可写方式打开文件
3.O_RDWR:读写方式打开文件
4.O_CREAT:如果文件不存在,就创建一个新的文件,并用第三的参数为其设置权限
5.O_EXCL:如果使用O_CREAT时,文件存在,则可返回错误消息
6.O_NOCTTY:使用其时,如文件为终端,那么终端不可以作为调用open()系统调用的那个进程的控制终端
7.O_TRUNC:如文件已经存在,那么在写入之间线删除原有数据
8.O+APPEND:以添加方式打开文件,在打开文件的同时,文件指针指向文件的末尾。
(前三个互斥,在使用无意义组合,系统不予处理)
perms 背带开文件的存取权限
返回值
文件的描述字
功能
打开文件
===========================================
头文件
#include<unistd.h>
原型
int close(int fd)
参数作用
fd 文件描述字
返回值
成功返回0 错误返回-1
功能
关闭文件
===========================================
头文件
#include<unistd.h>
原型
int read(int fd,void *buf,int count);
参数作用
fd 文件描述字
buf 输入缓冲
count 每次读取的字节数量
返回值
返回0 读到了eof
返回-1 读的过程有错误
>0 读取的字节数
功能
读文件
===========================================
头文件
#include<unistd.h>
原型
int write(int fd,void *buf,int count);
参数作用
fd 文件描述字
buf 输出缓冲
count 每次写取的字节数量
返回值
写入的字节数
功能
读文件
用这几个函数,我们就可以做些简单的程序,下面是一个文件显示程序,显示文本文件的内容(你也可以显示非文本文件,只要你看的懂)
请使用GCC -o type type.c编译,然后用./type type.c来试一下
//type.c
//www.beeship.com
//pianopan@beeship.com
//2002-1-12
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#define PERMS 0666
#define DUMMY 0
main(argc,argv)
int argc;
char *argv[];
{
int source_fd,target_fd,num;
char iobuffer;
if(argc!=2)
{
printf("ERROR:Canshubugou.
");
exit(1);
}
if((source_fd=open(*(argv+1),O_RDONLY,DUMMY))==-1)
{
printf("ERROR:wenjiandabukai.
");
exit(1);
}
printf("
===========BeeShip Type===========
");
printf("File name : %s
",*(argv+1));
while((num=read(source_fd,&iobuffer,1))>0)
printf("%c",iobuffer);
printf("
===========BeeShip Type===========
");
return 0;
}
上面的程序只使用了我们所说的3个函数,那么在编一个copy命令,代码如下:
请使用GCC -o copy copy.c编译
//type.c
//www.beeship.com
//pianopan@beeship.com
//2002-1-14
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#define PERMS 0666
#define DUMMY 0
#define BUFSIZE 1024
int bs_copyfile(char *file_name1,char *file_name2)
{
//www.BeeShip.com
//PianoPan (Email PianoPan@BeeShip.com)
//2002-2-5am
//file copy function
int source_fd,target_fd,num;
char iobuffer[BUFSIZE];
//open the source file
if((source_fd=open(file_name1,O_RDONLY,DUMMY))==-1)
return 1;
if((target_fd=open(file_name2,O_WRONLY|O_CREAT,PERMS))==-1)
return 2;
while((num=read(source_fd,iobuffer,BUFSIZE))>0)
if (write(target_fd,iobuffer,num)!=num)
return 3;
close(source_fd);
close(target_fd);
return 0;
}
main(argc,argv)
int argc;
char *argv[];
{
int i;
if(argc!=3)
{
printf("ERROR:copy Source Target.
");
exit(0);
}
i=bs_copyfile(*(argv+1),*(argv+2));
switch(i)
{
case 1:
printf("1");
break;
case 2:
printf("2");
break;
case 3:
printf("3");
break;
default:
printf("0");
}
return 0;
}
这两个程序程序都没有移动文件的描述字,让我们下次在讲解一下其他文件操作函数。
以上代码均通过RedHat7.2下GCC编译测试