Linux文件编程


文件编程:
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 1024
int 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值