/*
标椎IO实现
*/
#include <stdio.h>
#include <stdlib.h>
int my_cp(const char *src,const char *obj);
int main(int argc,const char **argv)
{
if(argc < 1)
{
printf("no the file or dictory\n");
return -1;
}
else if(argc < 2)
{
printf("no obj file!\n");
return -1;
}
my_cp(argv[1],argv[2]);
return 0;
}
int my_cp(const char *src,const char *obj)
{
FILE *fp1 = fopen(src,"r");
if(fp1 == NULL)
{
perror("open src failed!\n");
return -1;
}
FILE *fp2 = fopen(obj,"w");
if(fp2 == NULL)
{
perror("open obj failed!\n");
return -1;
}
char *date_buf = calloc(1,1024);
while(1)
{
long len1 = ftell(fp1); //ftell函数能获取到当前文件偏移量距离文件首的偏移量
int nmemb = fread(date_buf,1024,1,fp1);
if(nmemb < 1) //小于缓冲块数是快要到达文件文件结束标志,要在这里进一步判断
{
long len2 = ftell(fp1);
fwrite(date_buf,len2 - len1,1,fp2);
if(feof(fp1))//判断是否到达文件末尾
{
printf("file copy finshed!\n");
break;
}
else
{
printf("copy failed!\n");
break;
}
}
else
{
fwrite(date_buf,1024,1,fp2);
}
}
fclose(fp1);
fclose(fp2);
free(date_buf);
return 0;
}
/
/*
系统IO
*/
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <sys/mman.h>
#include "ts.h"
int func_cp(const char *src,const char *obj);
int main(int argc,const char **argv)
{
if(argc < 1)
{
printf("pls input src file\n");
return -1;
}
else if(argc < 2)
{
printf("pls input obj file\n");
}
func_cp(argv[1],argv[2]);
return 0;
}
/*
功能: 拷贝源文件带目标文件
参数: src:源文件路径
obj:目标文件路径
返回值:整形
*/
int func_cp(const char *src,const char *obj)
{
int fd1 = open(src,O_RDWR);
if(fd1 == -1)
{
perror("src file open failed!\n");
return -1;
}
int fd2 = open(obj,O_RDWR|O_CREAT|O_APPEND);//如何不存在就创建
if(fd2 == -1)
{
perror("obj file open failed!\n");
return -1;
}
char *file_buf = calloc(1,1024); //申请1024个字节的堆内存作为缓冲区
/* 考虑到不同文件字节数不同的,无法使用一个固定内存一次性完成复制 */
int len;
while(1) //利用判断读取的返回值判断是否到达文件末尾
{
len = read(fd1,file_buf,1024);
if(len == -1)
{
printf("read failed!\n");
break;
}
else if(len == 0)
{
printf("copy have finshed!\n");
break;
}
else
{
write(fd2,file_buf,len);
}
}
close(fd1);
close(fd2);
free(file_buf);
}