利用文件I/O与标准I/O进行文件的拷贝(c语言)

  1 /*
  2  * 需求描述:分别使用文件IO,标准字符、标准行、标准块IO实现文本文件的拷贝功能
  3  * 思考,如果是普通的图片、视频文件,上述拷贝哪些可以用,哪些不可以用
  4  * */
  5 #include <stdio.h>
  6 #include <sys/types.h>
  7 #include <sys/stat.h>
  8 #include <fcntl.h>
  9 #include <unistd.h>
 10 
 11 
 12 
 13 /*
 14  * 利用文件IO的方式,实现2个文件的拷贝
 15  * */
 16 int copy_by_fileIO(const char *dest_file_name, const char *src_file_name) {
 17     int fd1,fd2;
 18     int len;
 19 
 20     //打开文件
 21     fd1 = open(src_file_name,O_RDONLY);
 22     fd2 = open(dest_file_name,O_WRONLY);
 23 
 24     //获得文件大小,并且将当前位置移到开头
 25     len = lseek(fd1, 0, SEEK_END);
 26     lseek(fd1,0,SEEK_SET);
 27 
 28     unsigned char buf[len];
 29 
 30     //读取fd1中的内容
 31     read(fd1,&buf,len);
 32 
 33     //写入内容到fd2
 34     write(fd2,&buf,len);
 35 
 36     //关闭文件
 37     close(fd1);
 38     close(fd2);
 39 }
 40 
 41 /*
 42  * 利用标准IO的字符IO,实现2个文件的字节拷贝
 43  * */
 44 int copy_by_char(const char *dest_file_name, const char *src_file_name) {
 45     FILE *fp1,*fp2;
 46     int ch;
 47 
 48     fp1 = fopen(src_file_name,"r");
 49     fp2 = fopen(dest_file_name,"w");
 50 
 51     ch = fgetc(fp1);
 52 
 53     while(ch != EOF){
 54         fputc(ch,fp2);
 55         ch = fgetc(fp1);
 56     }
 57 
 58     fclose(fp1);
 59     fclose(fp2);
 60 }
 61 
 62 /*
 63  * 利用标准IO的行IO,实现2个文件的按行拷贝
 64  * */
 65 int copy_by_line(const char *dest_file_name, const char *src_file_name) {
 66     FILE *fp1,*fp2;
 67     char *res;
 68     char buf[1024];
 69 
 70     fp1 = fopen(src_file_name,"r");
 71     fp2 = fopen(dest_file_name,"w");
 72 
 73     res = fgets(buf,sizeof(buf),fp1);
 74 
 75     while(res){
 76         fputs(buf,fp2);
 77         res = fgets(buf,sizeof(buf),fp1);
 78     }
 79 
 80     fclose(fp1);
 81     fclose(fp2);
 82 }
 83 
 84 /*
 85  * 利用标准IO的块IO,实现2个文件的块拷贝
 86  * */
 87 int copy_by_block(const char *dest_file_name, const char *src_file_name) {
 88     FILE *fp1,*fp2;
 89     char res[3] = {0};
 90     int len;
 91 
 92     fp1 = fopen(src_file_name,"r");
 93     fp2 = fopen(dest_file_name,"w");
 94 
 95     fseek(fp1,0,SEEK_END);
 96     len = ftell(fp1);
 97     fseek(fp1,0,SEEK_SET);
 98 
 99     printf("len:%d",len);
100 for(int i=0;i<len;i++) {
101     fread(res, sizeof(char), 1, fp1);
102     fwrite(res, sizeof(char), 1, fp2);
103 }
104     fclose(fp1);
105     fclose(fp2);
106 }
107 
108 int main() {
109     char *src_file_path = "./profile";
110     char *dest_file_path = "./test_profile";
111     copy_by_block(dest_file_path,src_file_path);
112     return 0;
113 }

 

posted @ 2021-10-19 23:38  yangrourou  阅读(654)  评论(0编辑  收藏  举报