Linux C语言文件拷贝练习

 int open(const char *pathname, int flags);
 int open(const char *pathname, int flags, mode_t mode);

 open函数一般有两个参数和三个参数的形式,两个参数形式第一个参数为文件路径,第二个参数为打开方式(宏定义),如果有O_CREAT参数,需要有第三个参数指定文件权限。由宏定义的方式给出 COPYMODE,返回值为文件描述符

int creat(const char *pathname, mode_t mode);

create函数有两个参数,第一个参数是文件路径,第二个参数是文件权限,返回

ssize_t read(int fd, void *buf, size_t count);

read函数有三个参数,第一个参数是文件描述符,第二个数读到的内存首地址(字符串指针),第三个参数是读入的最大文件大小

返回值是读到文件的大小
ssize_t write(int fd, const void *buf, size_t count);

write函数有三个参数,第一个参数是文件描述符,第二参数是写入内存首地址(字符串指针),第三个参数是写入最大字节数,返回值是写入生成文件的字节数

close函数比较简单,直接跟文件描述符即可。

off_t lseek(int fd, off_t offset, int whence)是定位文件指针位置函数,第一个参数是文件描述符,第二个参数是文件偏移量,第三个参数是文件定位的位置,有三个宏定义参数,分别是SEEK_SET为文件开头offset处,SEEK_CUR为当前位置加offset,offset可以取正值或负值,SEEK_END为文件末尾加offset,返回值为文件偏移量,出错返回-1

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdlib.h>
#define BUFFERSIZE 4096
#define COPYMODE 0644

void oops(char *, char *);


int main(int argc, char *argv[])
{
	int in_fd, out_fd, n_chars;
	char buf[BUFFERSIZE];

	if(argc!=3)
	{
        // 命令行参数个数错误判断
		fprintf(stderr, "usage: %s source destination\n",*argv);
		exit(1);
	}

	if((in_fd = open(argv[1], O_RDONLY)) == -1)
		oops("Cannot open ", argv[1]);                // 打开源文件
	
	if((out_fd = creat(argv[2], COPYMODE)) == -1)
		oops("Cannot creat", argv[2]);                // 创建生成文件

	while((n_chars = read(in_fd, buf, BUFFERSIZE))>0) // 读取源文件
	{
		if( write(out_fd, buf, n_chars)!=n_chars)     // 写入生成文件
			oops("Write errot to ",argv[2]);
	}

	if (n_chars == -1)
		oops("Read error from ",argv[1]);

	if (close(in_fd == -1 || close(out_fd) == -1))    // 关闭文件
		oops("Error closing files","");

	return 0;
}

void oops(char *s1, char *s2)
{
	fprintf(stderr,"Error: %s ",s1);
	perror(s2);
	exit(1);
}

 

另一种写法传入文件描述符的拷贝函数io.c 函数声明在io.h

#include "io.h"
#include <unistd.h>
#include <errno.h>
#include <fcntl.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>

# define BUFFER_LEN 4096

void copy(int fdin, int fdout)
{
	char buffer[BUFFER_LEN];
	ssize_t size;
	while(size = read(fdin, buffer, BUFFER_LEN))
	{
		printf("read size: %ld\n", size);
		printf("current: %ld\n", lseek(fdin, 0L, SEEK_CUR));
		if(write(fdout, buffer, size)!=size)
		{
			fprintf(stderr, "write error:%s \n", strerror(errno));
			exit(1);
		}
	}

	if(size<0)
	{
		fprintf(stderr, "read error: %s\n", strerror(errno));
		exit(1);
	}
}

cp.c

#include "io.h"
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>


int main(int argc, char *argv[])
{
	if(argc != 3)
	{
		fprintf(stderr, "usage: %s srcfile destfile\n",argv[0]);
		exit(1);
	}
	
	int fdin, fdout;
	fdin = open(argv[1], O_RDONLY);
	printf("file length: %ld\n",
			lseek(fdin, 0L, SEEK_END));
	
	lseek(fdin,0L,SEEK_SET);
	if(fdin < 0)
	{
		fprintf(stderr,"open error: %s\n", strerror(errno));
		exit(1);
	}
	else
	{
		printf("open file: %d\n", fdin);
	}

	fdout = open(argv[2], O_WRONLY | O_CREAT | O_TRUNC, 0777);

	if(fdout < 0)
	{
		fprintf(stderr, "open error:  %s\n",strerror(errno));
		exit(1);
	}
	else
	{
		printf("open file: %d\n",fdout);
	}

	copy(fdin,fdout);
	close(fdin);
	close(fdout);
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值