Linux文件编程

来源:互联网 发布:中小学网络教育市场 编辑:程序博客网 时间:2024/05/17 04:29
文件编程:
1、系统调用
int creat(const char *filename,mode_t mode)
filename:创建的文件名(可以加上路径,默认是当前目录)
mode:属性,创建模式S_IRUSR可读,S_IWUSR可写,S_IXUSR可执行,S_IRWXU
除上述宏外,还可用数字表示权限。

int main(int argc,char *argv[]),argc表示参数个数,如./hello,则argc=1,argv里则存放里具体的参数。
   

文件描述符:所有打开的文件都分配一个,实质是一个非负整数,当打开一个文件时,该整数由系统分配。

int open(const char *pathname,int flags)pathname指要打开的文件名,可以包括路径。

标志一般有:O_RDONLY,O_WRONLY,O_RDWR,O_APPEND(以追加方式打开),O_CREAT(创建一个文件),O_NOBLOCK(无阻塞方式)

如果使用O_CREATE方式,则使用函数:int open(const char *pathname,int flags,mode_t mode),通过mode来指定文件权限。

#include <stdio.h>#include <stdlib.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>int main(int argc,char *argv[]){int fd;if(argc<2){puts("please input open files pathname\n");exit(1);}if((fd=open(argv[1],O_CREAT|O_RDWR,0755))<0){perror("open file failure!\n");exit(1);}else{printf("open file %d success!\n",fd);}close(fd);exit(0);}
   文件关闭:int close(fd);fd为文件描述符
   文件读:int read(int fd,const void *buf,size_t length);从文件描述符fd读length个字节到buf所指向的缓冲区中。
   文件写:int write(int fd,const void *buf,size_t length);把length个字节从buf所指向的缓冲区写到文件描述符fd所指向的文件。
   文件定位:int lseek(int fd,offset_t offset,int whence)操作成功时,返回文件指针相对于文件头的位置。whence表示从什么地方移动指针(基准点),offset向前移动是正直,向后移动是负值。如何用lseek计算文件长度?将文件指针移动到文件尾。如下:
lseek(fd,0,SEEK_END)

    文件权限查询:int access(const char *pathname,int mode)mode可以是R_OK,W_OK,X_OK,F_OK文件存在。测试成功时,返回值为0,否则有一个条件不符时返回-1.

下面是一个综合实例,实现拷贝一个文件file_cp.c

#include <stdio.h>#include <stdlib.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <errno.h>#define BUFFER_SIZE 1024int main(int argc,char **argv){int from_fd,to_fd;int bytes_read,bytes_write;char buffer[BUFFER_SIZE];char *ptr;if(argc!=3){fprintf(stderr,"Usage:%s fromfile tofile/n/a",argv[0]);exit(1);}//打开源文件if((from_fd=open(argv[1],O_RDONLY))==-1){fprintf(stderr,"open %s is error",argv[1],strerror(errno));exit(1);}//创建目的文件if((to_fd=open(argv[2],O_WRONLY|O_CREAT,S_IRUSR|S_IWUSR))==-1){fprintf(stderr,"open %s is error",argv[2],strerror(errno));exit(1);}//拷贝文件while(bytes_read=read(from_fd,buffer,BUFFER_SIZE)){//一个致命的错误发生if((bytes_read==-1)&&(errno!=EINTR))break;else if(bytes_read>0){ptr=buffer;while(bytes_write=write(to_fd,ptr,bytes_read)){//一个致命的错误发生if((bytes_write==-1)&&(errno!=EINTR))break;//写完了所有读的字节else if(bytes_write==bytes_read)break;//只写了一部分,继续写else if(bytes_write>0){ptr+=bytes_write;bytes_read-=bytes_write;}}//写的时候发生致命错误if(bytes_write==-1)break;}}close(from_fd);close(to_fd);exit(0);}




0 0
原创粉丝点击